0

我有一段代码,在编译期间使用#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

4 回答 4

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

导致实现产生一个诊断消息,其中包括指定的预处理令牌序列。

于 2013-09-14T08:31:00.000 回答
2

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

于 2013-09-14T08:19:18.410 回答
1

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

于 2013-09-14T13:11:32.837 回答
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
    }
}

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

于 2013-09-15T16:03:03.167 回答