On Linux 2.4.24, using gcc 3.3.2 I'm following the instructions as described here: http://gcc.gnu.org/onlinedocs/gcc-3.3.2/gcc/Type-Attributes.html#Type%20Attributes Specifically, I say enum testEnum { x = 1, y = 2 } __attribute__((packed)); and I get: error: semicolon missing after declaration of `testEnum' I've also tried: enum __attribute__((packed)) testEnum2 { z = 3 }; typedef enum { abc = 4 } __attribute__((packed)) testEnum3; Both which fail with syntax errors. See cpp and gcc output listings below. It is not practical for us to use -fshort-enums, so we really need this to work. Please advise! Thanks -John Output of cpp: # 1 "enum.cpp" # 1 "<built-in>" # 1 "<command line>" # 1 "enum.cpp" enum testEnum { x = 1, y = 2 } __attribute__((packed)); enum __attribute__((packed)) testEnum2 { z = 3 }; typedef enum { abc = 4 } __attribute__((packed)) testEnum3; int main() { testEnum t; testEnum2 tt; testEnum3 ttt } --------------------------------- Output of gcc -v -save-temps enum.cpp : Reading specs from /home/jcooper/bin/lib/gcc-lib/i686-pc-linux-gnu/3.3.2/specs Configured with: ../gcc-3.3.2/configure --prefix=/home/jcooper/bin Thread model: posix gcc version 3.3.2 /home/jcooper/bin/lib/gcc-lib/i686-pc-linux-gnu/3.3.2/cc1plus -E -D__GNUG__=3 -quiet -v -D__GNUC__=3 -D__GNUC_MINOR__=3 -D__GNUC_PATCHLEVEL__=2 -D_GNU_SOURCE enum.cpp enum.ii ignoring nonexistent directory "/home/jcooper/bin/i686-pc-linux-gnu/include" #include "..." search starts here: #include <...> search starts here: /home/jcooper/bin/include/c++/3.3.2 /home/jcooper/bin/include/c++/3.3.2/i686-pc-linux-gnu /home/jcooper/bin/include/c++/3.3.2/backward /usr/local/include /home/jcooper/bin/include /home/jcooper/bin/lib/gcc-lib/i686-pc-linux-gnu/3.3.2/include /usr/include End of search list. /home/jcooper/bin/lib/gcc-lib/i686-pc-linux-gnu/3.3.2/cc1plus -fpreprocessed enum.ii -quiet -dumpbase enum.cpp -auxbase enum -version -o enum.s GNU C++ version 3.3.2 (i686-pc-linux-gnu) compiled by GNU C version 3.3.2. GGC heuristics: --param ggc-min-expand=36 --param ggc-min-heapsize=11837 enum.cpp:1: error: semicolon missing after declaration of `testEnum' enum.cpp:3: error: parse error before `__attribute__' enum.cpp:5: error: semicolon missing after enum declaration enum.cpp: In function `int main()': enum.cpp:10: error: `testEnum2' undeclared (first use this function) enum.cpp:10: error: (Each undeclared identifier is reported only once for each function it appears in.) enum.cpp:10: error: parse error before `;' token
Well this is no longer rejected on 3.4.0 but it still ignores the attribute for some reason. I think the documention was written for the C front-end but never updated for the C++ front-end at all.
Thanks Andrew for confirming. I see you've reclassified it as an enhancement. That being the case, can I expect it to be fixed in the near term?? If not, do you have any suggestions for a workaround? The reason we can't use -fshort-enums is it's a large complex system with interfaces into other systems. .. using -fshort-enums invariably leads to incosistencies and segfaults :( Thanks again, -John
I'm afraid it will take a while for this feature to be added. It is in fact an enhancement request. Also, even if a patch was made today, it would not be eligible for 3.4.x anymore, so it would go into 3.5.x, which won't see the light until 2005. Of course, if you can use a custom compiler version, you could backport such a patch to a local 3.4-based compiler. If you really need it done fast, I'm sure you can find a contractor that can develop it quite fast. I suggest you to ask on the gcc mailing list about it.
*** Bug 18165 has been marked as a duplicate of this bug. ***
Patch here: <http://gcc.gnu.org/ml/gcc-patches/2004-10/msg02462.html>.
Fixed in 4.0.0.
There are still problems with packed enums. John Cooper's example program compiles on g++ 4.3.2, but testEnum2 is still not packed. More details in Bug #39219.