C++ 使枚举在C+;中的结构内部定义+;具有全球范围

C++ 使枚举在C+;中的结构内部定义+;具有全球范围,c++,c,enums,scope,compatibility,C++,C,Enums,Scope,Compatibility,以下代码将编译为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.

以下代码将编译为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;
}
#包括
结构somestruct{
int-id;
枚举{
状态1=0,
国家2,
国家3,
国家4,
}国家;
};
int main(int argc,char*argv[])
{
静态结构somestruct s;
如果(s.state==STATE1){
printf(“state1\n”);
}
返回0;
}
在C++中,我必须使用<代码>某个结构::StestE1(因为枚举声明被限制为结构/类)。
我正在做的项目是用C编写的,但是目前我们使用一些C++库(ARDUIO),所以我们用C++编译器编译我们的C代码。那么,有没有办法让C++中的代码编译为C++?

< p>,是的,正如你所说:引用它为<代码>结构::StestE1 < /P> 我不知道你将如何使它能够跨两种语言移植,但我不明白你为什么需要这样做。写代码< >结构::在C++代码中,STATE1,和C代码中的<代码> STATE1。如果确实需要在宏之间切换而不复制代码,请使用宏


不要忘记修复损坏的表达式
s->state
s
不是指针。

可以使用c宏定义

#define STATE1 somestruct::STATE1
这应该允许进入状态1
我建议你不要使用它,因为你使用C++编译器,所以你不妨利用它给你的C++特性,只需放一些结构::Stiste1.< /P> < p>你可以用与两种语言兼容的形式来编码它,例如:

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

struct somestruct 
{
    int id ;
    eState state ;
};
或者,如果确实无法更改结构和枚举定义,则以下内容是可移植的(如果很难看),并要求您更改对枚举的每个引用,而不是单个定义(即,它没有什么优点):

然后:


使用
using
语句将标识符引入调用范围:

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

#ifdef __cplusplus
using somestruct::STATE1; // <-- here
#endif
struct somestruct{
int-id;
枚举{
状态1=0,
国家2,
国家3,
国家4,
}国家;
};
#ifdef_uucplusplus

使用somestruct::STATE1;//重新写入(将枚举从结构中拉出)?如果你不能重写它,你仍然可以用正确的C++ WORY问题(尝试外部C),这是没有帮助的)是的,有一种方法。事实上,你肯定已经知道了,因为你在问题中明确提到了它。使用
somestruct::STATE1
而不是
STATE1
!!!
...
    if (s.state == SOMESTRUCT(STATE1)) {
...
struct somestruct {
    int id;
    enum {
        STATE1 = 0,
        STATE2,
        STATE3,
        STATE4,
    } state;
};

#ifdef __cplusplus
using somestruct::STATE1; // <-- here
#endif