3

I hate defines. In the quest of eliminating as many of them as possible from an old code base, I need to rely on the enum-hack for defining structures containing arrays. Unfortunately, I'm not getting it to compile when the incriminated .h file gets included by C projects.

typedef struct _P_O {
    enum { MAXELEMENTS=10 };
    P_O_U elem;
    ULONG id[MAXELEMENTS];
    USHORT nid;
} P_O, *PP_O;

this produces error C2208:

'type' : no members defined using this type
An identifier resolving to a type name is in an aggregate declaration, but the compiler cannot declare a member.

OT: I hate using a compiler which is 10 y.o., having to mantain old c code and bad design too; not just defines :)

4

2 回答 2

6

鉴于问题中的代码,GCC 警告:warning: declaration does not declare anything对于 enum 行。

将枚举放在结构之外,你会没事的。

typedef int P_O_U;
typedef unsigned long ULONG;
typedef unsigned short USHORT;

enum { MAXELEMENTS = 10 };

typedef struct _P_O
{
    P_O_U  elem;
    ULONG  id[MAXELEMENTS];
    USHORT nid;
} P_O, *PP_O;
于 2013-08-01T15:26:01.187 回答
3
struct foo {
    enum { MAXELEMENTS=10 };
    long id[MAXELEMENTS];
};

像这样的 enum hack 在 C 中是有效的(但不是一种好的代码风格,请参阅@Jonathan Leffler 的评论)。因为当id定义时,MAXELEMENTS用枚举常量限定。

C99 6.2.1标识符的范围

结构、联合和枚举标记的范围紧随标记出现在声明标记的类型说明符中之后开始。每个枚举常量的作用域都在其定义枚举数出现在枚举数列表中之后开始。任何其他标识符的范围都在其声明符完成后开始。

枚举是一种整数常量。

C99 6.6常量表达式

整数常量表达式应具有整数类型,并且应仅具有整数常量、枚举常量、字符常量、其结果为整数常量的表达式的 sizeof 和作为强制转换的直接操作数的浮点常量的操作数。整数常量表达式中的强制转换运算符只能将算术类型转换为整数类型,但作为 sizeof 运算符的操作数的一部分除外。

最后,可以在数组声明符中使用整数常量,请参阅 C99 6.7.5.2数组声明符。这并不奇怪。

于 2013-08-01T15:22:57.093 回答