C中枚举问题的重新声明

Sma*_*llX 2 c enums scope compiler-errors redeclaration

我的 C 项目中出现编译错误。我有一个包含此枚举的头文件:

typedef enum {
  RAD_ALLOWED= 0,         
  RAD_STOPPED ,
  RAD_OFF 
} Values_E;
Run Code Online (Sandbox Code Playgroud)

并在另一个带有此枚举的头文件中:

typedef enum {
  RAD_ALLOWED= 0,         
  RAD_STOPPED ,
  RAD_OFF 
} Values_X;
Run Code Online (Sandbox Code Playgroud)

当我将两个头文件包含在同一个 c 文件中时,我遇到类似于以下内容的错误:

214: error: previous definition of 'RAD_STOPPED ' was here
129: error: redeclaration of enumerator 'RAD_STOPPED '
Run Code Online (Sandbox Code Playgroud)

是的,两个枚举的内容是相同的,但名称不同,所以我不明白为什么会出现这个问题。请注意,包含这些枚举的两个头文件都是自动生成的,因此我无法更改它们的内容。

Joh*_*ger 5

是的,两个枚举的内容是相同的,但名称不同,所以我不明白为什么会出现这个问题。

问题不是枚举名称的冲突,而是它们声明的枚举常量的名称冲突。枚举常量的名称位于普通标识符的命名空间中,因此它们在所有范围内的枚举定义中必须是不同的。鉴于您使用它们而不参考定义它们的枚举这一事实,这是有道理的。

请注意,包含这些枚举的两个头文件都是自动生成的,因此我无法更改它们的内容。

如果您仅使用枚举常量而不使用枚举类型,那么您可以只选择要包含的枚举定义之一,并省略另一个。例如,#include "values_e.h"但忽略values_x.h. 显示的两个枚举定义将生成对应于相同值的枚举常量,因此如果只有常量的值很重要,那么从哪个枚举获取它们并不重要。然而,如果您使用的任何其他标头本身间接包含枚举定义,这可能说起来容易做起来难。

或者,您可以拆分代码,以便没有一个源文件需要引用两种枚举类型。

否则,您的下一个最佳选择是更改代码生成器,这样就不会产生名称冲突。

或者,如果您不能这样做,那么您可以应用一些宏油脂来实现本地重命名,如下所示:

// Beginning of file

#define RAD_ALLOWED E_RAD_ALLOWED
#define RAD_STOPPED E_RAD_STOPPED
#define RAD_OFF E_RAD_OFF
#include "values_e.h"
#undef RAD_ALLOWED
#undef RAD_STOPPED
#undef RAD_OFF

#define RAD_ALLOWED X_RAD_ALLOWED
#define RAD_STOPPED X_RAD_STOPPED
#define RAD_OFF X_RAD_OFF
#include "values_x.h"
#undef RAD_ALLOWED
#undef RAD_STOPPED
#undef RAD_OFF

// everything else ...
Run Code Online (Sandbox Code Playgroud)

然后,在该源文件中,您可以使用这些标识符的E_*X_*版本,而不是无前缀的标识符。这有潜在的问题,但如果你没有更好的选择,那么值得一试。