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

时间:2015-06-08 16:10:51

标签: c macros x-macros

我想为X(a, b)

所有a > b的X-macro生成编译时错误
/* X(a, b) */
#define LIST \
    X(10, 20) \
    X(5,  20) \
    X(30, 20) \
    X(1,  20)

因此,为X(30, 20)

生成错误

这可能在C?

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

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

2 个答案:

答案 0 :(得分:2)

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

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

因此,我们定义X来定义一个int类型的数组,其中包含-1或1,具体取决于a是否大于b。如果是,则-1元素的数组将导致错误。

如果使用C11,可以使用static_assert(a<=b)

中的assert.h来完成typedef行

答案 1 :(得分:2)

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

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

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