有没有办法在调用特定的宏时停止编译?我的意思是当用户在代码中插入此宏时显示错误字符串?我可以将宏定义为错误吗?
答案 0 :(得分:2)
我不知道有任何标准工具可以执行此操作,但您可以尝试在宏扩展中创建语法错误。你可以做这样的事情,例如:
#define MYMACRO (MYMACRO: "Please don't use this macro")
每当使用MYMACRO
时,这应始终导致语法错误。注意在自身内部使用MYMACRO
以确保无法编译。
其中一条错误消息如下所示:
b.c: In function ‘main’:
b.c:1:18: error: ‘MYMACRO’ undeclared (first use in this function)
#define MYMACRO (MYMACRO: "Please don't use this macro")
答案 1 :(得分:2)
你可以使用运行时断言,例如。
# define C_ASSERT( ) { struct tmp { char dead[-1];};}
这给出了负下标。您还可以添加一个受限制的常量表达式,这将允许某种形式的测试,例如。
# define C_ASSERT( ) { struct tmp { char dead[-1];};}
# define C_ASSERT2( x ) { struct tmp { char dead[ (x) * 2 -1];};}
int test()
{
C_ASSERT2( sizeof( long ) < sizeof( int ) );
C_ASSERT();
}
答案 2 :(得分:1)
虽然似乎并不是一个明显的标准机制,但是为每种实现定义其他行为是#pragma
指令的用途,there is a GCC/Clang pragma用于这种情况:
#pragma GCC error "Not supported"
虽然#pragma
是一个指令,但它也有一个运算符形式(在6.10.9中定义),它可以从宏扩展并将任何给定#pragma
的消息作为字符串文字,完全相同的效果:
// ...which can be packaged in the operator as:
_Pragma("GCC error \"Not supported\"")
message
,GCC warning
,GCC error
和GCC diagnostic
开放令牌通过pragma
机制提供各种消息传递选项,因此您可以执行此操作使用其中一个编译器或另一个与GCC兼容的编译器。
我认为从技术上讲,您应该能够通过扩展定义如下的宏来导致错误:
#define err() _Pragma("STDC this is not a valid STDC directive")
,因为
如果预处理标记
STDC
紧跟在指令中的pragma
之后(在任何宏替换之前),则不对该指令执行宏替换,并且该指令应具有以下之一形式...
似乎pragma
消息以STDC
开头但不是6.10.6中列出的消息之一是不符合的。因此,理论上你可以为一个宏提供一个以STDC
开头的字符串,然后将其余的错误消息发送到_Pragma
以获得自定义错误机制。
不幸的是,这似乎并没有在实践中发挥作用。 Clang(我必须在这里测试)会认识到pragma信息不合法,但只会警告它;即使使用-Werror
标志,它仍然在错误输出之前完成处理文件,这可能不是您想要它做的。幸运的是,实施定义的方式。