2016-08-04 13 views
26

Given program:ISO C++ zabrania odwołania przesyłają typów 'enum'

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

g++ -c test.cpp działa dobrze. Jednak clang++ -c test.cpp daje następujące błędy:

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. 

Te komunikaty o błędach nie ma sensu do mnie. Nie widzę tu żadnych odniesień do przodu.

+0

FWIW, GCC teraz (od 5 lub 6) kompiluje się z '-std = C++ 14' jako domyślnie, podczas gdy Clang nadal używa '-std = C++ 98' AFAIK. – chris

+2

Myślę, że to pomogłoby, gdyby włączyć wersje kompilatora i opcje. – juanchopanza

+0

Wersje kompilatora (plus transkrypcja z pełną powłoką dla osób sugerujących, że mój rzeczywisty kod źródłowy nie odpowiada temu w pytaniu): https://dump.thecybershadow.net/6bf06811a8f77fce574017622d1dd8e7/21%3A51%3A18-upload.txt –

Odpowiedz

22

Określenie typu bazowego dla wyliczenia to funkcja języka C++ 11. Aby uzyskać kod do kompilacji, należy dodać przełącznik -std=c++11. Działa to zarówno dla GCC, jak i Clanga.

Dla wyliczeń w C++ 03, leżący u podstaw typ całki jest definiowany przez implementację, chyba że wartości modułu wyliczającego nie mogą być dopasowane do int lub unsigned int. (Jednak kompilator Microsoftu zezwolił na określenie bazowego typu wyliczenia jako prawnie zastrzeżonego rozszerzenia od VS   2005.)

+2

Masz rację: jeśli skompilujesz z opcją -std = C++ 11 działa ([online demo] (https://gcc.godbolt.org/#compilers :! ((kompilator: clang380, opcje: '- std% 3Dc% 2B% 2B11 ', źródło:' enum + E +: + int% 0A% 7B% 0A ++++ A, + B, + C% 0A% 7D% 3B ')), filterAsm: (commentOnly: ! t, dyrektywy:! t, labels:! t), version: 3)). W przypadku gcc starszego niż 6 dajesz wyraźne ostrzeżenie. Z gcc 6 no nead dla flagi STD. – Christophe

+2

@Christophe: To znaczy: z gcc 6, oni (ostatecznie) zmienili go tak, aby kompilował C++ 11 domyślnie i wymagał przełącznika, aby był zgodny ze starszymi standardami. –