5

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

4

6 回答 6

11

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

于 2009-07-28T12:08:49.100 回答
5

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

#if LAST_ENUM_1 != LAST_ENUM_2
   #error Enums have different sizes
#endif
于 2009-07-28T12:35:48.507 回答
1

我真的很喜欢其他答案,而不是我现在建议的答案......

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

于 2009-07-28T13:32:29.117 回答
0

使用喜欢

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

    END_OF_ENUM = 3
}

如果您使用这种格式,也许您可​​以更轻松地处理所有事情

于 2009-07-28T13:16:32.383 回答
0

Since the compiler looks at one source file (translation unit, TU) at a time, there is no way for it to complain about a mismatch between the current TU and some other TU that it is not looking at.

You need to fix things so that you have one copy of the definition of the enum that is used by both programs - so it belongs in a header that is included by both. Pretty much anything else is too error prone for comfort.

于 2009-07-29T03:58:16.830 回答
0

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

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

于 2009-07-28T13:11:09.830 回答