2016-08-04 16 views
26

ileri referansları yasaklar:ISO C++ programı göz önüne alındığında 'enum' tiplerine

enum E : int 
{ 
    A, B, C 
}; 

g++ -c test.cpp inşaat iyi. Bu hata iletileri bana anlamlı yapmazlar

test.cpp:1:6: error: ISO C++ forbids forward references to 'enum' types 
enum E : int 
    ^
test.cpp:1:8: error: expected unqualified-id 
enum E : int 
    ^
2 errors generated. 

: Ancak clang++ -c test.cpp aşağıdaki hataları verir. Burada herhangi bir ileri referans göremiyorum.

+0

FWIW, GCC artık (5 veya 6'dan itibaren) ile derlenmiştir: ‑std = C++ 14' Varsayılan olarak, Clang hala ‑std = C++ 98' AFAIK kullanıyor. – chris

+2

Derleyici sürümleri ve seçenekleri dahil ederseniz yardımcı olacağını düşünüyorum. – juanchopanza

+0

Derleyici sürümleri (ayrıca, gerçek kaynak kodumun söz konusu olanla aynı olmadığını düşündüren kişiler için tam kabuk metni): https://dump.thecybershadow.net/6bf06811a8f77fce574017622d1dd8e7/21%3A51%3A18-upload.txt –

cevap

22

Enum için temel yazı tipini belirtmek, C++ 11 dil özelliğidir. Kodu derlemek için -std=c++11 anahtarını eklemelisiniz. Bu GCC ve Clang hem de çalışır.

C++ 03'teki enumlar için, sayımın değerleri bir int veya unsigned int'ye sığmadıkça temeldeki integral tür uygulama tanımlıdır. (Ancak, Microsoft'un derleyicisi VS   2005'ten beri özel bir uzantı olarak özel bir uzantının türünü belirtmeye izin vermiştir.)

+2

Haklısınız: eğer -std = C++ 11 seçeneği ile derler iseniz ([online demo] (https://gcc.godbolt.org/#compiler :! ((derleyici: clang380, options: '-) std% 3Dc% 2B% 2B11' , kaynak: 'enum + E + + int% 0A% 7B% 0A ++++ A + B + C,% 0A% 7D% 3B')), filterAsm: (commentOnly: ! t, direktifler:! t, etiketler:! t), sürüm: 3)). 6'dan büyük gcc ile size açık bir uyarı verir. Gcc 6 ile std bayrağı için nead değil. – Christophe

+2

@Christophe: Diğer bir deyişle: gcc 6 ile, (en sonunda) C++ 11'i varsayılan olarak derlemek için değiştirdiler ve eski standartlara uygun bir anahtar gerektiriyorlar. –

İlgili konular