为什么预处理器命令必须从第一个非空格开始

Why do preprocessor commands have to start as first nonwhite space

本文关键字:第一个 空格 开始 预处理 处理器 命令 为什么      更新时间:2023-10-16

我正在尝试通过二传手线进行 #ifndef,但收到此错误

"错误 20 错误 C2014:预处理器命令必须作为第一个非空格启动">

我知道错误意味着,我只是好奇为什么会这样?它是编译器的选择吗?这背后的原因是什么?用户更容易注意到吗?

如果有人想知道,这是代码:

inline void SetSomething(int value) { #ifndef XBOX ASSERT(value <= 1); #endif test = value; };

起初C没有任何标准的预处理器。然后人们开始使用预处理作为外部工具。您可能会注意到,#与Unix-land shell脚本中的注释相同。

随着语言的发展,预处理器与编译器和语言本身的更多部分集成在一起,但它保持了完全不同的结构,即特别是它是面向行的,而C和C++核心语言是自由形式的。

在那之后,界限变得更加模糊。现在,预处理通常会添加#line指令或等效指令供核心语言编译器使用,#pragma指令也用于核心语言编译器,而在另一个方向上,我们现在有_Pragma(IIRC(。结构仍然基本与原始结构相同。C 和 C++ 是进化的语言,而不是设计语言。

看看标准(第 16 节"预处理指令"(以 # 开头作为最简洁的非空格字符,这就是根据定义构成预处理指令的原因。

预处理

指令由满足以下约束的一系列预处理令牌组成: 序列中的第一个标记是 # 预处理令牌,(在转换阶段 4 开始时(是 源文件中的第一个字符(可选在不包含换行符的空格之后(或 后面跟着至少包含一个换行符的空格。

如果你想要最重要的原因,那是因为标准是这么说的。

如果你想知道为什么标准这么说,这是获得必要功能的最简单方法。
请记住,预处理和编译是两个可能完全独立的任务,预处理器根本不知道其输出的语言。

相关文章: