在C中输出#error指令

时间:2013-09-14 08:16:56

标签: c

我有一段代码,使用#error指令在编译期间抛出错误,检查板上存在的芯片类型。当我运行它时,我得到一个如下所示的输出:

errorchk.c:9:2: error: #error "I can't run"

我原本希望看到这样的错误:

errorchk.c:9: error: "I can't run"

我无法弄清楚第9行(如果有的话)中的错误,如下所示。

#include "stdio.h"
#define X 2
void main()
{
  int x=6;
    if(x>5)
    {
#if X>1
#error "I can't run"
#endif
    }
}

有人可以澄清标准输出上的消息是否符合预期吗?本质上," #error" 应该打印在错误字符串中?

4 个答案:

答案 0 :(得分:4)

C标准没有准确指定编译器应该输出的内容,只是输出中必须包含#error之后的标记。你得到的输出是“符合”。不同的编译器可以做不同的事情。

例如,clang具有不同的格式,但它也符合:

$ cat t.c
#error hello
$ clang -c t.c
t.c:1:2: error: hello
#error hello
 ^
1 error generated.

根据需要打印错误,并附加上下文。

参考:C11草案,§6.10.5错误指令

  

表单

的预处理指令
# error pp-tokensopt new-line
     

导致实现生成包含指定的诊断消息   预处理令牌序列。

答案 1 :(得分:2)

这是预期的输出(到stderr,而不是stdout)。

答案 2 :(得分:1)

我建议知道它是#error指令抛出的消息而不是内置的编译器消息,这是诊断的一个有用部分。无论哪种方式,语言标准都没有规定任何类型的编译器诊断的实际格式。

答案 3 :(得分:0)

“我无法弄清楚第9行的错误是什么”

使用以#开头的指令的宏在编译其余代码之前运行,更不用说执行了。

错误很明显。当预处理器到达第9行时,X被定义为2,因此条件为真,并且#error指令触发,停止编译。

在某些人看来,此时x的值为6。但是C代码没有被执行。它甚至没有编译。 X和x彼此无关。

一个更有趣的例子是在两个地方使用相同的情况,X或x。

#include "stdio.h"
#define X 2
void main()
{
    int X=6;
    if(X>5)
{
#if X>1
#error "I can't run"
#endif
    }
}

在那种情况下,它们仍然不是一回事。相反,预处理器将用字符2替换源中字符X的每个出现。即使您删除了错误指令,代码也不会编译,因为行int 2=6;无效C.