以下代码将编译为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 ;
};

另外,如果您确实不能更改struct和enum定义,则以下内容是可移植的(如果很丑陋),并且要求您更改对枚举的每个引用,而不是单个定义(即,IMO的优点不多):
#if defined __cplusplus
    #define SOMESTRUCT(e) somestruct:: e
#else
    #define SOMESTRUCT(e) e
#endif

然后:
...
    if (s.state == SOMESTRUCT(STATE1)) {
...

10-07 21:05