使用C ++中的结构定义的枚举具有全局范围

时间:2015-04-27 19:08:34

标签: 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.state == STATE1) {
        printf("state1\n");
    }

    return 0;
}

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

4 个答案:

答案 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。