1

我想为所有X(a, b)地方的 X-macro 生成编译时错误a > b

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

所以,产生错误X(30, 20)

这在C中可能吗?

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

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

2 回答 2

2

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

#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,typedef 行可以使用static_assert(a<=b)fromassert.h

于 2015-06-08T16:31:09.933 回答
2

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

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

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

于 2015-06-08T16:32:43.723 回答