SORU
23 EKİM 2008, PERŞEMBE


Nasıl c birden fazla dosya tarafından kullanılacak bir başlıkta bir yapı bildirmek için?

Eğer bir kaynak varsa.c bir yapı ile dosya:

struct a
{ 
    int i;
    struct b
    {
        int j;
    }
};

Nasıl bu yapı başka bir dosya (8 *yani*) kullanılabilir mi?

Yeni bir başlık dosyası oluşturmak, bu yapı orada ilan ve func.c başlık dahil etmeli miyim?

Ya da başlık dosyasında tüm yapı tanımlamak ve source.c func.c hem de o vardır? Nasıl yapı extern her iki dosya içinde ilan edilebilir mi?

typedef etmeliyim? Eğer öyleyse, nasıl?

CEVAP
23 EKİM 2008, PERŞEMBE


bu yapı başka bir dosya işlev tarafından kullanılacak ise.bunu nasıl c?

Bir yazın, bir dosya (yani işlev kullanılır.dosya c), görünür olmalı. Çok kötü yapman gereken, her yapıştırın.

Doğru başlık dosyası koyarak ve gerektiğinde bu başlık dosyası vardır.

yeni bir üstbilgi dosyası açın ve yapısı var bildirmek ve işlev bu başlık dahil edelim.c?

Bu kod son derece modüler yapar çünkü daha çok seviyorum çözümdür. Yapı olarak kod istiyorum:

#ifndef SOME_HEADER_GUARD_WITH_UNIQUE_NAME
#define SOME_HEADER_GUARD_WITH_UNIQUE_NAME

struct a
{ 
    int i;
    struct b
    {
        int j;
    }
};

#endif

Aynı Başlığı işlevleri bu yapıyı kullanarak koyardım (işlevidir "anlamsal" bir parçası "arayüz").

Ve genellikle, yapı adından sonra dosya adı, ve o ismi bir daha kullanma korumaları tanımlar Başlığı tercih edebilirim.

Eğer bir işlev yapı için bir işaretçi kullanarak ilan etmek istiyorsanız, tam yapı tanımı ihtiyacınız olmayacak. Basit bir ileri bir bildiri gibi

struct a ;

Yeterli olacaktır, ve kaplin azaltır.

veya başlık dosyası içinde toplam yapısını tanımlamak ve her iki kaynağında o vardır.c ve fonksiyonel.c?

Bu başka bir yoldur, biraz daha kolay, ama daha az modüler: Bazı kodlar işe sadece yapı hala tüm türlerini içeriyor olması gerek.

C , bu ilginç bir komplikasyon yol açabilir, ama bu konu dışı (C etiketi), ayrıntı vermeyeceğim.

nasıl dosyalarının her ikisinin de dış yapısı olarak ilan etmek. ?

Nokta göremiyorum, belki, ama Greg Hewgill görevinden çok iyi bir cevabı var http://stackoverflow.com/questions/228684/how-to-declare-a-structure-in-a-header-that-is-to-be-used-by-multiple-files-in-c#228691.

typedef o zaman nasıl yapalım?

  • Eğer C kullanıyorsanız , yok.
  • Eğer C kullanıyorsanız, gerekir.

Nedeni C yapı yönetimi olmak bir ağrı olabilir: kullanıldığı her yerde: yapı anahtar sözcük beyan etmek gerekiyor

struct MyStruct ; /* Forward declaration */

struct MyStruct
{
   /* etc. */
} ;

void doSomething(struct MyStruct * p) /* parameter */
{
   struct MyStruct a ; /* variable */
   /* etc */
}

Bir typedef sen yapı anahtar olmadan yazmak için izin verir.

struct MyStructTag ; /* Forward declaration */

typedef struct MyStructTag
{
   /* etc. */
} MyStruct ;

void doSomething(MyStruct * p) /* parameter */
{
   MyStruct a ; /* variable */
   /* etc */
}

önemlihala bu yapı için bir ad tutun. Yazma:

typedef struct
{
   /* etc. */
} MyStruct ;

sadece typedef-ed adıyla anonim bir yapı oluşturur ve ileriye dönük beyan etmek mümkün olmayacaktır. Bu yüzden aşağıdaki biçime tutun:

typedef struct MyStructTag
{
   /* etc. */
} MyStruct ;

Böylece, MyStruct yapı anahtar kelime ekleyerek önlemek için istediğiniz her yerde kullanmak, ve hala bir typedef işe yaramaz zaman MyStructTag kullanmak mümkün (ileri Bildirgesi gibi) olacak

Düzenleme:

Haklı Jonathan Leffler tarafından söylendiği gibi C99 yapı hakkında yanlış varsayım düzeltilmiş beyanı,.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Brandon McCrary

    Brandon McCr

    15 Ocak 2012
  • kylelandry

    kylelandry

    9 AĞUSTOS 2007
  • Kyletiv7

    Kyletiv7

    28 Mayıs 2007