c/c++预处理器在遇到未知指令时如何工作?

How do c/c++ preprocessors work when encountering unknown directives?

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

举个例子,

#include <stdio.h>

#hello
int main(){
    printf("Hello World!");
    return 0;
}

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

语言语法指定了语言中存在的所有 pre-processor 指令。如果您为该指令使用任何其他名称,则为“conditionally-supported-directive”。如果不支持有条件支持的指令,则需要语言实现来发出诊断消息,并且可以自由拒绝继续。

一个无法识别的预处理指令错误会上升,你的代码将无法编译

C

在句法上,#hello 是一个“non-directive”预处理指令。

C17/C18 第 6.10 节第 9 段(C17/C18 中新增)说:

The execution of a non-directive preprocessing directive results in undefined behavior.

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

C++

在句法上,#hello 是一个“conditionally-supported-directive”预处理指令。

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

A conditionally-supported-directive is conditionally-supported with implementation-defined semantics.

"Conditionally-supported" 表示不需要实现来支持它。实现需要记录所有它们不支持的 conditionally-supported 结构。 (在 conditionally-supported-directives 的情况下,我想这相当于记录其中 none 受支持,或记录受支持的语义。 )