2016-08-10 5 views
6

yılında C'den anonim yapıyı ilanİleri ben böylece bir şey göre değişebilir, bu dosya otomatik bir program aracılığıyla oluşturulur</p> <pre><code>typedef struct { ... }A; </code></pre> <p>benzer bir anonim yapıya sahip bir üçüncü şahıs C kütüphane var C++

Şimdi

void foo(const A & in) 
    { 
    ... 
    } 

olarak örneğin, yukarıdaki tür argümanı kabul C++ projede ben ileriye yukarıdaki işlevini tanımlayan başlık dosyasına a bildirmek nasıl?

denedim:

typedef struct A A; 

veya

struct A; 

ve meraktan da

typedef A A; 

. Bununla birlikte, bunlar türün yeniden tanımlanması için derleme zamanı hatasıyla sonuçlanır. Teşekkürler

+0

'typedef struct {...} A; '? Tanımını yapan kitaplık için başlık dosyasını ekleyemez misiniz? – rjp

+0

Bu, anonim bir yapı değil (C standardında 6.7.2.1p13'e bakın). "Struct" veya "union" dışında bir anonim yapıya sahip olamazsınız. – Olaf

+0

C, C++ değildir. Sadece C++ standardını kullanın. Sorunun ne olduğu belli değil, hiçbirini göremiyorum. 'Typedef'ed adını kullanarak sorun nedir? – Olaf

cevap

6

Ne yazık ki şanssızsınız.

A etiketsiz bir struct için typedef olup. Ve doğrudan doğruya bu struct'a başvuramayacağınızı bildiremezsiniz.

Jeneratörünü typedef struct A { ... } A; çıkışları için değiştirebilir misiniz? Daha sonra hem C hem de C++ 'da iyi bir derleme yaparsınız ve siz ' un C++ 'da olduğunu beyan edersiniz.

Aksi takdirde iki seçeneğiniz vardır: 1. #include, struct bildirimini içeren dosya. 2. struct'u el ile kopyalayın. Açıkça (1) çok daha fazla tercih edilir.

+2

Bu etiketsiz bir 'struct', adsız değil. – Olaf

+0

@Olaf: bu yararlı. Doğru terimi arıyordum. – Bathsheba

+0

Sadece netleştirmek için: C terminolojisini kullanıyorum ve sadece bir sonuca varıyorum: etiket eksik, bu yüzden "etiketsiz" doğru adın olacağını düşünüyorum. – Olaf

1

Yapamazsınız, çünkü tür takma adlar bildirilemez. Sadece gerçek tipler olabilir.

İlgili konular