编译器#警告:打印枚举值

时间:2020-02-11 11:06:10

标签: c enums constants compiler-warnings

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

打印原因:enum的常量最大值不能超过某个值,但是由于其值是自动递增的,因此我无法直接在代码中检查该值: 。在此示例中,az必须小于[any u_int]。

我尝试根据this post对值进行字符串化,但是它仅适用于typedef enum {a, b, ... az } mytype_t;的值。我尝试对#define值进行变体,但是我无法获得要打印的实际值,只能显示其名称。

是否有一种在编译时打印枚举值(或常量变量)的方法?谢谢。

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

2 个答案:

答案 0 :(得分: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。)

答案 1 :(得分:0)

正如Frankie_C所写的注释,您必须对预处理和处理进行分类。枚举在预处理后评估,而#define,#pragma,#warning在预处理时评估