C程序 - 检查两个枚举在编译时是否同步

时间:2009-07-28 12:05:31

标签: c enums compilation sync

我遇到的问题是我在两个不同的文件中有两个枚举,它们应该具有相同的常量集(两个不同的进程由两个文件和其他文件一起生成)。我希望枚举是同步的,即当有人为枚举x添加新值并忘记更新其他枚举时,我想抛出编译错误。那可能吗?

6 个答案:

答案 0 :(得分:11)

为什么不将此声明放在单个头文件中,然后将其包含在需要的两个位置?

答案 1 :(得分:5)

让每个枚举以已知的枚举结束,例如LAST_ENUM_1和LAST_ENUM_2。在有权访问两个头文件的文件中使用#if进行比较。

#if LAST_ENUM_1 != LAST_ENUM_2
   #error Enums have different sizes
#endif

答案 2 :(得分:1)

我真的很喜欢其他答案,而不是我现在要提出的答案......

如果所有其他解决方案都不适合您,请编写一个简单的perl脚本,检查它们是否相同,并确保从您的makefile调用perl脚本。 它会解决您的问题,但如果可以,请尽量避免。

答案 3 :(得分:0)

枚举中使用的名称必须是明确的,因此您将遇到问题:编译器是否可以访问这两个定义,然后由于名称问题或编译器只能访问,枚举不能相同一个定义一个时间,然后没有什么可以检查。

即使在编译时也无法检查元素的数量(由Robert提出)(preprocesser对枚举一无所知)。如果你真的不能拥有一个通用的头文件,那么最容易做的就是在你的应用程序开始时进行运行时检查。

答案 4 :(得分:0)

使用

enum EMyEnum
{
    JOE   = 0,
    BLACK = 1,
    WHITE = 2,

    END_OF_ENUM = 3
}

如果您使用这种格式,也许您可​​以更轻松地处理一切

答案 5 :(得分:0)

由于编译器一次查看一个源文件(翻译单元,TU),因此无法抱怨当前TU与其未查看的其他TU之间的不匹配。

您需要修复一些内容,以便您拥有两个程序使用的枚举定义的一个副本 - 因此它属于两者都包含的标头。几乎任何其他东西都太容易让人感到安慰。