调用特定宏时显示自定义错误字符串

时间:2015-09-01 19:57:50

标签: c c-preprocessor

有没有办法在调用特定的宏时停止编译?我的意思是当用户在代码中插入此宏时显示错误字符串?我可以将宏定义为错误吗?

3 个答案:

答案 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\"")

messageGCC warningGCC errorGCC 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标志,它仍然在错误输出之前完成处理文件,这可能不是您想要它做的。幸运的是,实施定义的方式。