为什么预处理器命令必须从第一个非空格开始
Why do preprocessor commands have to start as first nonwhite space
我正在尝试通过二传手线进行 #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 开始时(是 源文件中的第一个字符(可选在不包含换行符的空格之后(或 后面跟着至少包含一个换行符的空格。
如果你想要最重要的原因,那是因为标准是这么说的。
如果你想知道为什么标准这么说,这是获得必要功能的最简单方法。
请记住,预处理和编译是两个可能完全独立的任务,预处理器根本不知道其输出的语言。
相关文章:
- 获取向量C++中第一个值和最后一个值的和
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 我有两个类需要在同一 cpp 文件中相互引用,但第一个类无法识别第二个类类型的对象
- 为什么有时我输入一个整数,程序将第一个输入的数字打印成十进制数?
- 如何在创建自定义迭代器时获得 std::p air 的第一个和第二个?
- 如何实现 Front() 方法以返回模板化双向链表C++的第一个元素?
- WinAPI 在单击第一个对话框上的按钮控件并销毁第一个对话框后创建第二个对话框
- 查找数组中第一个最小值和最后一个最大值元素之间的算术平均值
- 如何读取文件忽略第一个空格?
- C++ : 如何在使用 getline() 和 ifstream 对象从文件中读取一行时跳过第一个空格?
- 当字符串中只有一个"GOOD"字符串可用时,从没有空格的字符串中提取第一个单词的最佳和有效方法?
- 删除 C++ 中字符串中第一个单词之前的空格
- 无法在前面有多余空格的情况下获取要打印的数组.只有第一个值会用空格打印
- 为什么预处理器命令必须从第一个非空格开始
- LPCSTR-如何检查第一个位置是否为空格" "
- 在空格处拆分字符串并返回C++中的第一个元素
- 试图忽略第一个字符之前的所有空格(迫切需要一个简单的轻推)
- 用空格分割字符串,但只得到第一个单词
- 当我为第一个字符串(C++)输入空格时,如何删除输出中的双引号和逗号