新答案:
在我的原始答案(如下)中,我必须有两个不同的宏来支持函数范围和全局范围内的断言。我想知道是否有可能提出一个适用于两种范围的单一解决方案。
我能够使用外部字符数组找到适用于 Visual Studio 和 Comeau 编译器的解决方案。但我能够找到适用于 GCC 的更复杂的解决方案。但是 GCC 的解决方案不适用于 Visual Studio。:( 但是添加一个'#ifdef __ GNUC __',很容易为给定的编译器选择正确的宏集。
解决方案:
#ifdef __GNUC__
#define STATIC_ASSERT_HELPER(expr, msg) \
(!!sizeof \ (struct { unsigned int STATIC_ASSERTION__##msg: (expr) ? 1 : -1; }))
#define STATIC_ASSERT(expr, msg) \
extern int (*assert_function__(void)) [STATIC_ASSERT_HELPER(expr, msg)]
#else
#define STATIC_ASSERT(expr, msg) \
extern char STATIC_ASSERTION__##msg[1]; \
extern char STATIC_ASSERTION__##msg[(expr)?1:2]
#endif /* #ifdef __GNUC__ */
STATIC_ASSERT(1==1, test_message);
以下是test.c 第 22 行报告的错误消息:
海合会:
line 22: error: negative width in bit-field `STATIC_ASSERTION__test_message'
视觉工作室:
test.c(22) : error C2369: 'STATIC_ASSERTION__test_message' : redefinition; different subscripts
test.c(22) : see declaration of 'STATIC_ASSERTION__test_message'
科莫:
line 22: error: declaration is incompatible with
"char STATIC_ASSERTION__test_message[1]" (declared at line 22)
原始答案:
我做的事情与 Checkers 所做的非常相似。但我包含一条消息,该消息会出现在许多编译器中:
#define STATIC_ASSERT(expr, msg) \
{ \
char STATIC_ASSERTION__##msg[(expr)?1:-1]; \
(void)STATIC_ASSERTION__##msg[0]; \
}
对于在全局范围内(函数外)做某事,请使用:
#define GLOBAL_STATIC_ASSERT(expr, msg) \
extern char STATIC_ASSERTION__##msg[1]; \
extern char STATIC_ASSERTION__##msg[(expr)?1:2]