在C中的结构内定义的枚举具有全局范围

以下代码将编译为C,但不能编译为C:

#include <stdio.h>

struct somestruct {
    int id;
    enum {
        STATE1 = 0,
        STATE2,
        STATE3,
        STATE4,
    } state;
};

int main(int argc, char *argv[])
{
    static struct somestruct s;

    if (s.state == STATE1) {
        printf("state1\n");
    }

    return 0;
}

在C中,我将不得不使用somestruct :: STATE1(因为枚举声明仅限于struct / class?).
我正在研究的项目是用C语言编写的,但目前我们使用的是一些C库(Arduino),所以我们用C编译器编译我们的c代码.那么有没有办法让上面的代码在C中编译?

最佳答案 您可以使用与两种语言兼容的形式对其进行编码,例如:

typedef enum 
{
    STATE1 = 0,
    STATE2,
    STATE3,
    STATE4,
} eState ;

struct somestruct 
{
    int id ;
    eState state ;
};

或者,如果您真的无法更改结构和枚举定义,那么以下是可移植的(如果丑陋),并且要求您更改对枚举的每个引用而不是单个定义(即它没有什么优点IMO):

#if defined __cplusplus
    #define SOMESTRUCT(e) somestruct:: e
#else
    #define SOMESTRUCT(e) e
#endif

然后:

...
    if (s.state == SOMESTRUCT(STATE1)) {
...
点赞