我想为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)
答案 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必须是常量。