x-macro 条件错误 - 数字比较

x-macro conditional error - number comparison

我想为所有 X(a, b) 的 X 宏生成编译时错误,其中 a > b

/* X(a, b) */
#define LIST \
    X(10, 20) \
    X(5,  20) \
    X(30, 20) \
    X(1,  20)

因此,为 X(30, 20)

生成错误

这在 C 中可行吗?

编辑:用法示例 对我来说,左边的数字是例如一些大结构的 sizeof,右边的数字是固定的 space 来存储这个结构。如果结构大于可用 space,我需要编译器生成错误。

//e.g.
X(sizeof(struct conf), 2*PAGE)

是的,这是一个概念证明:

#pragma push_macro("X")
#undef X
#define X(a,b) typedef int x[(a>b)?-1:1];
LIST
#pragma pop_macro("X")

所以,我们定义X来定义一个整数数组类型,取-1或1,取决于a是否大于b。如果是,-1个元素的数组会出错。

如果使用 C11,则可以使用 assert.h

中的 static_assert(a<=b) 来完成 typedef 行

在 C11 中可以使用 _Static_assert 关键字:

#define X( a , b )  _Static_assert( a <= b , "Error!" ) 

注意表达式 a 和 b 必须是常量。