SORU
4 Kasım 2009, ÇARŞAMBA


typedef yapı vs yapı tanımlar

C programlama bir acemi değilim, ama bir yapı tanımlayan karşı değil typedef typedef kullanırken kullanma arasındaki fark ne olduğunu merak ediyordum. Çok fark yok gibi, onlar aynı yapmak gibi geliyor bana.

struct myStruct{
    int one;
    int two;
};

vs

typedef struct{
    int one;
    int two;
}myStruct;

CEVAP
4 Kasım 2009, ÇARŞAMBA


Her ikisini de kullanarak ortak deyim: typedef struct X { int x; } X;

Farklı tanımları vardır. Tartışmaya açık cümle dağıtacağım:

struct S { int x; };
typedef struct S S;

İlk satırdaki adı yapı alanı içindeki tanımlayıcı S (C anlamda değil) tanımlama. Kullanmak ve değişken tanımlamak struct S bağımsız değişkenin türü tanımlayarak yeni tanımlanan türü bağımsız değişken işlev:

void f( struct S argument ); // struct is required here

İkinci satır türü genel ad alanı S ad ve böylece sadece yazmak ekler:

void f( S argument ); // struct keyword no longer needed

Unutmayın bu yana hem tanımlayıcı adı boşluk farklı tanımlama S hem de yapılar ve küresel boşluk değil, bir hata olarak değil, yeniden aynı tanımlayıcı, daha ziyade oluşturarak farklı bir tanımlayıcı farklı bir yer.

Farkı daha net yapmak için:

typedef struct S { int x; } T;
void S() {} // correct
//void T() {} // error: symbol T already defined as an alias to 'struct S'

Tanımlayıcılar farklı alanlarda tutulur olarak Yapı aynı isimde bir fonksiyon tanımlayabilirsiniz, ama bu tanımlayıcılar çarpışır gibi bir typedef ile aynı adı taşıyan bir fonksiyon tanımlanamaz.

C , kurallar biraz daha farklı kurnazca değişen bir sembol bulmak için. C hala iki farklı tanımlayıcı boşluk tutar, ama sadece sınıf tanımlayıcı boşluk içindeki sembol tanımlarken C farklı olarak, sınıf kelime/: yapı sağlamak için gerekli değildir

 // C  
 struct S { int x; }; // S defined as a class
 void f( S a ); // correct: struct is optional

Değişiklikler ne tanımlayıcılar tanımlanmamış arama kuralları vardır. Derleyici global tanımlayıcı tablo arama S sınıf tanımlayıcıları içinde S için arayacaktır bulunamadı.

Kodu daha önce sunulan aynı şekilde davranır:

typedef struct S { int x; } T;
void S() {} // correct [*]
//void T() {} // error: symbol T already defined as an alias to 'struct S'

Sonra tanımı S işlevi ikinci satır, yapı S çözülemeyen tarafından otomatik olarak derleyici ve oluşturmak için bir nesne ya da tanımlamak bir argüman bu tür gerekir geri düşmek de dahil olmak üzere yapı anahtar kelime:

// previous code here...
int main() {
    S(); 
    struct S s;
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • We've moved!

    We've moved!

    7 Ocak 2008
  • MisterBrightside

    MisterBright

    24 Mart 2006
  • pleated-jeans

    pleated-jean

    6 HAZİRAN 2013