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