当遇到未知指令时,C/C++ 预处理器如何工作?

Net*_*al. 1 c c++ preprocessor c-preprocessor preprocessor-directive

c/c++ 预处理器是否处理所有以 # 开头的行?遇到未知宏时会出错还是会忽略它们?

举个例子,

#include <stdio.h>

#hello
int main(){
    printf("Hello World!");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下会发生什么?它会产生错误还是会起作用(忽略#hello行)?

eer*_*ika 6

语言语法指定该语言中存在的所有预处理器指令。如果您对该指令使用任何其他名称,则该指令是“有条件支持的指令”。如果不支持有条件支持的指令,则语言实现需要发出诊断消息,并且可以自由拒绝继续。


Ian*_*ott 5

C

从语法上讲,#hello是一个“非指令”预处理指令。

C17/C18第6.10节第9段(C17/C18新添加)说:

执行非指令预处理指令会导致未定义的行为。

“未定义的行为”并不一定意味着编译器将无法翻译代码或发出诊断。(编辑:正如 Eric Postpischil 在评论中指出的,非指令预处理指令的执行不会违反约束,因此不需要诊断。)它可以以记录的方式运行,例如,如果该指令是C语言的扩展。

C++

从语法上讲,#hello是一个“条件支持指令”预处理指令。

C++20 第 15.1 节第 2 段说:

有条件支持的指令有条件地支持实现定义的语义。

“有条件支持”意味着不需要实现来支持它。实现需要记录它们不支持的所有有条件支持的构造。(在有条件支持的指令的情况下,我想这相当于记录它们都不被支持,或者记录那些受支持的语义。)