On 13 February 2011 17:04, Jonathan Wakely <jwakely.gcc@xxxxxxxxx> wrote: > On 13 February 2011 10:41, Graham Bloice wrote: >> The following code fails to compile on GCC 4.5.1 (CodeSourcery G++ >> Lite for ARM), whereas it compiles happily under the ARM compiler and >> Visual Studio 2010. >> >> #ifdef __cplusplus >> extern "C" { >> #endif >> >> typedef enum abc xyz; >> enum abc { >> p1 = 0, >> p2, >> p3 >> }; >> >> #ifdef __cplusplus >> } >> #endif >> >> The errors produced are: >> >> test.cpp:5:14: error: use of enum 'abc' without previous declaration >> test.cpp:5:21: error: invalid type in declaration before ';' token >> >> Is this a bug, or stricter compliance? > > Stricter compliance, the code is not valid in C++98 > >> Is there an option to permit >> this sort of construct to compile? > > I don't believe so, no. > >> I'm aware that putting the typedef >> after the enum definition allows it to compile, but this would then >> mean modifying the vendor supplied headers and keeping track of >> changes would be much more difficult. > > C++0x allows an enumeration type to be declared by an > opaque-enum-declaration, which I think would allow you to put a > declaration of the type before the vendor header: > > enum abc; > #include "abc.h" > > G++ doesn't support this though. > Some more more investigation leads me to believe that the original source for this problem, the 'cloud' ARM compiler for mbed (http://mbed.org) compiles all the code in 'C' mode. Passing '-x C' as a flag to g++ allows this to compile. That then reveals that I don't have the include for the cstdlib on the path, but that's another issue.