【问题标题】:Compiler #warning: print enum value编译器#warning:打印枚举值
【发布时间】:2020-05-26 18:41:30
【问题描述】:

我想将枚举的值打印为#warning#pragma message。我使用 typedef enum 而不是 #define'ing 值,因为它使编辑更容易,并允许键入函数参数和返回值。

打印原因:enum 的常量最大值不得超过某个值,但是我无法直接在代码中检查该值,因为它的值是自动递增的:typedef enum {a, b, ... az } mytype_t;。在本例中,az 必须小于 [any u_int]。

我尝试根据this post 对值进行字符串化,但它仅适用于#define'd 值。我尝试了 enum 值的变体,但无法打印出实际值,只能打印其名称。

有没有办法在编译时打印一个枚举值(或者也是一个 const 变量)?谢谢。

编辑: 我使用 Microchips XC8 编译器(8 位)和 C99。

【问题讨论】:

  • 您无法打印enum 值,因为它是在预处理后进行评估的。该值在 #warning#pragma message 时间根本不可用。
  • 使用_Static_assert。它不会打印值,但会提供您想要的测试。
  • 什么编译器? #warning 不是标准 C,#pragma X 是特定于编译器的。
  • 还有“枚举值不能超过某个值”是什么意思,是枚举变量的运行时值还是枚举常量的值?
  • @Frankie_C:现在说得通了! @EricPostpischil:谢谢!我发现了一些对我有用的东西。不是那么漂亮,但可以完成工作。 @Lundin:我忘了说明。我将 Microchips XC8(8 位编译器)与 C99 一起使用,我将编辑我的帖子并添加此信息;我的意思是enum 的常量值。它是 eeprom 的地址列表,大小为 256 字节。

标签: c enums constants compiler-warnings


【解决方案1】:

C 标准没有提供在预处理器宏或其他编译时方法中报告枚举常量值的方法。但是,可以测试该值是否在所需范围内。

从 C 2011 开始,您可以使用 _Static_assert 来测试枚举常量:

enum { a, b, c, d, e };

_Static_assert(e <= 3, "Enumeration constant exceeds 3.");

在 C 2011 之前,您可以通过多种方式组合测试,例如:

enum { a, b, c, d, e };

int FailIfSizeMismatches[1];      // Define array with good size.
int FailIfSizeMismatches[e <= 3]; // Define with conflicting size if test fails.

(在 C++ 中,将 _Static_assert 替换为 static_assert。)

【讨论】:

  • 谢谢你,埃里克。正如我上面提到的(为时已晚:)),我使用 C 99。但是我找到了使用您的关键字的解决方案:#define STATIC_ASSERT(COND,MSG) typedef char static_assertion_##MSG[(!!(COND))*2-1]。编译器的输出并不漂亮,但这并不重要,因为它只在错误时显示。 BR
  • 我也试过这个方法。但是我不像另一个那样喜欢它,因为我要么必须声明两个数组并且在我的代码中没有“漂亮”的 ASSERT(x)。 #define ASSERT do {your 2nd example} while(0) 也只能在函数中工作,而不是标题。但是,正如我链接的帖子中所写,我有一个解决您的问题的方法。失败时返回 -1 的三元查询:#define STATIC_ASSERT(COND,MSG) typedef char static_assertion_##MSG[(COND)?1:-1]
【解决方案2】:

正如 Frankie_C 所写的评论,你必须对预处理和处理进行分类。 enum 在预处理后评估,而#define、#pragma、#warning 在预处理时评估

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    相关资源
    最近更新 更多