C枚举不同的编译器

时间:2009-05-13 16:30:17

标签: c++ c gcc enums mingw

我正在构建一个需要在Windows和Linux上编译的应用程序。应用程序是用C语言编写的,除了MinGW编译器拒绝这个

之外几乎所有东西都可以工作
typedef struct somestruct{
   ...snip...
   enum {NODE, REAL} type;
};

somestruct* something;
switch (something->type){
 case NODE:
   ...stuff...;
   break;
 case REAL:
   ...otherstuff...;
   break;
}

它说没有定义NODE和REAL, 但是如果我提供范围分辨率

case somestruct::NODE

这与MinGW 3.4.1编译,但无法在linux上使用gcc 4.1.2进行编译。这只是一个需要用预处理器解决的编译器问题,还是有其他解释?

2 个答案:

答案 0 :(得分:6)

应用程序是用“C”编写的,但编译器要求你执行somestruct::NODE,这是有效的“C ++”,但不是有效的“C”。

结论:您正在使用C ++模式的MinGW编译此代码,但所有其他编译器都处于C模式。

可能的原因:MinGW可能不会同等对待foo.Cfoo.c,并且您的文件以大写C后缀命名(这意味着UNIX上的C ++)。

解决方案:向MinGW添加-xc标志以强制执行plain-C编译。

答案 1 :(得分:3)

如果你摆脱了嵌套,它应该可以移植:

typedef enum somestruct_type {
    somestruct_type_NODE, somestruct_type_REAL
} somestruct_type;
typedef struct somestruct {
   ...snip...
   somestruct_type type;
} somestruct;

我看到与此非常相似的代码被移植到大量的C和C ++编译器中。

(我不是说这是唯一的方法;我只是说这种方式有效)。