C yapı üyesi için varsayılan değer


84

Bazı yapı üyeleri için varsayılan değerler ayarlamak mümkün müdür? Aşağıdakileri denedim ama sözdizimi hatasına neden oluyor:

Hatalar:


Yapı için bir başlatıcı işlevi oluşturabilirsiniz.
sgarizvi

5
C'de değil. Yine de istediğiniz değerlerle bir yapı döndüren bir işlev yapabilirsiniz.
Vaughn Cato

Oluşturduğunuzda değerleri şu şekilde başlatabilirsiniz: stackoverflow.com/questions/749180/default-values-in-ac-struct
Fantastic Mr Fox

C ++ yapısı için, yapıcıda varsayılan verileri başlatabilirsiniz
Zac

Yanıtlar:


126

Yapı bir veri türüdür . Bir veri türüne değer vermezsiniz. Veri türlerinin örneklerine / nesnelerine değerler verirsiniz.
Yani C'de bu mümkün değil.

Bunun yerine, yapı örneği için başlatmayı gerçekleştiren bir işlev yazabilirsiniz.

Alternatif olarak şunları yapabilirsiniz:

Ve sonra her zaman yeni örneklerinizi şu şekilde başlatın:


3
Global bir dizim varsa: 'MyStruct arr [MAX_SIXE];', işlev nasıl kullanılabilir? (NOte: Tüm üyeye gidecek ve bayrağı ayarlayacak bir init () işlevine sahip
olamıyorum

10
MyStruct_default, sabit olarak bildirilmelidir.
Lundin

1
Cevabınız için teşekkürler. Çevrimiçi olarak test etmek için bir kod sanal alanı oluşturmayı bıraktım
HoldOffHunger

52

bu şekilde yapamazsın

Bunun yerine aşağıdakileri kullanın

Örneklerinizi tanımlamak ve başlatmak için makroyu kullanabilirsiniz . bu, her yeni örnek tanımlamak ve onu başlatmak istediğinizde sizin için daha kolay hale gelecektir.

ve kodunuzda, çalışan türü ile yeni bir örnek tanımlamanız gerektiğinde, bu makroyu şöyle çağırırsınız:


1
Gereksinimleri yerine getirmeyen parametreye geçmek istiyorsanız iyi görünmüyor.

18

C'deki yapıyı tanımlarken ilklendiremeyeceğiniz konusunda Als ile aynı fikirdeyim. Ancak, aşağıdaki gibi örnek oluştururken yapıyı başlatabilirsiniz.

C'de,

C ++ 'da aşağıda gösterilen yapı tanımında doğrudan değer vermek mümkündür


13

Yapabilirsin:

Ve sonra, yeni bir çalışan değişkeni bildirdiğinizde varsayılan başlatmayı yapmayı hatırlamanız gerekir:

Alternatif olarak, çalışan yapınızı her zaman bir fabrika işlevi aracılığıyla oluşturabilirsiniz.


8

Eğer kullanıyorsanız , nesne yaratmada gccverebilirsiniz designated initializers.

Ya da basitçe dizi başlatma gibi kullanın.

employee e = {0 , "none"};


1
Bazı kodların belirlenmiş başlatıcılar için de iki nokta üst üste kullandığını gördüm, bu soruda daha fazlası: stackoverflow.com/questions/1601201/…
sdaau

7

Diğer cevapların da belirttiği gibi varsayılan bir yapı oluşturun:

Ancak, yukarıda kod, bir başlık dosyasında çalışmaz - hatayı alırsınız: multiple definition of 'MyStruct_default'. Bu sorunu çözmek için, externbunun yerine başlık dosyasında kullanın:

Ve cdosyada:

Umarım bu başlık dosyasıyla ilgili sorun yaşayan herkese yardımcı olur.


Birkaç yıl sonra bir yorum: Bunu doğrudan başlık dosyasında yapabilmeniz muhtemelen daha mantıklı olacaktır.
David Callanan

5

Dahası, mevcut yanıtları eklemek için yapı başlatıcıyı gizleyen bir makro kullanabilirsiniz:

Sonra kodunuzda:


3

Bir başlatma işlevi uygulayabilirsiniz:


C struct değişken nesnesi e'nin (sabit olsun veya olmasın), içinde tanımlandığı blok çıktığında uzaklaşacağına dikkat çekildi. Bir işaretçi ise, sarkan işaretçi sorununa neden olur. Dolayısıyla, dönüş türünün bir işaretçi olması iyi bir çözüm değildir. En iyi yol, C yapı başlatıcılarını kullanarak varsayılan değerlere sahip statik bir genel yapı değişken nesnesine sahip olmak ve değişkenin program çalışma zamanı sırasında değerlerini değiştirmek için set ve get işlevlerini kullanmaktır. Veya yerel bir yapı değişkeni nesnesini parametre olarak bir set işlevine iletin ve özellik değerlerini set işlevi içinde değiştirin.
ecle

2
Üzgünüm ama bu sadece yanlış @ecle. Dönüş değeri bir işaretçi değil, çıplak bir yapıdır. Referans olarak iade edilmeyecek, kopyalanacaktır. Dürüst olmak gerekirse, derleyici muhtemelen en iyi duruma getirecektir.
bitmask

@bismask Beni yanlış anlamayın .. İşlev bir işaretçi ise bir işaretçi döndürürse bahsetmiştim . Belki son düzenlememden önce önceki yorumuma yorum yapmışsınızdır.
ecle

2

Yapıyı başlatmak için aşağıdaki gibi bazı işlevleri kullanabilirsiniz,

DÜZENLE:


2
Peki ya küresel bir yapı dizisine sahip olmak istersem, GetMyStruct () 'ın çağrılmasını nasıl önerirsiniz?
user1508893

GetMyStruct'ın malloc kullanması gerekmez mi?
Dmitry


1

Bu yapıyı sadece bir kez kullanırsanız , yani bir global / statik değişken oluşturursanız, typedefbu değişkeni anında kaldırabilir ve başlatabilirsiniz :

Daha employeesonra kodunuzda kullanabilirsiniz .


0

Bir yapının ilklendirme işlevi, ona varsayılan değerler vermenin iyi bir yoludur:

Veya daha da kısa:


Global bir dizim varsa: 'MyStruct arr [MAX_SIXE];', işlev nasıl kullanılabilir? (NOte: Tüm üyeye gidecek ve bayrağı ayarlayacak bir init () işlevine sahip
olamıyorum

0

Varsayılan değerlere başka bir yaklaşım. Yapı ile aynı türde bir başlatma işlevi yapın. Bu yaklaşım, büyük kodu ayrı dosyalara ayırırken çok kullanışlıdır.


0

Bunun için bir işlev oluşturabilirsiniz:


0

Diğer bir yaklaşım, yapı izin veriyorsa, içindeki varsayılan değerlerle bir #define kullanmaktır:

Kullanım:


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.