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 受支持,或记录受支持的语义。 )
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 受支持,或记录受支持的语义。 )