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 必须是常量。
我想为所有 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 必须是常量。