以下代码将编译为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 ++中编译?
答案 0 :(得分:3)
您可以使用与两种语言兼容的形式对其进行编码,例如:
typedef enum
{
STATE1 = 0,
STATE2,
STATE3,
STATE4,
} eState ;
struct somestruct
{
int id ;
eState state ;
};
或者如果您真的无法更改结构和枚举定义,那么以下是可移植的(如果难看),并要求您将每个引用更改为枚举而不是单个定义< / em>(即它没有什么价值IMO):
#if defined __cplusplus
#define SOMESTRUCT(e) somestruct:: e
#else
#define SOMESTRUCT(e) e
#endif
然后:
...
if (s.state == SOMESTRUCT(STATE1)) {
...
答案 1 :(得分:1)
使用using
语句将标识符带入调用范围:
struct somestruct {
int id;
enum {
STATE1 = 0,
STATE2,
STATE3,
STATE4,
} state;
};
#ifdef __cplusplus
using somestruct::STATE1; // <-- here
#endif
答案 2 :(得分:0)
在C ++中,是的,正如您所说的那样:将其称为somestruct::STATE1
。
我不知道你是如何能够在两种语言中使用这种语言的,但是我再也不知道你为什么需要这种语言。在C ++代码中写somestruct::STATE1
,在C代码中写STATE1
。如果确实需要在它们之间进行切换而不重复代码,请使用宏。
别忘了修复破碎的表达s->state
; s
不是指针。
答案 3 :(得分:-2)
您可以使用c宏定义
#define STATE1 somestruct::STATE1
应该允许去STATE1 我建议不要使用c ++编译器,所以你也可以使用它给你的c ++功能,只需输入somestruct :: STATE1。