在 C/C++ 预处理器中,单个井号/哈希符号 (#) 在自己的行上有什么用
What is the purpose of a single pound/hash sign (#) on its own line in the C/C++ preprocessor?
我一直在查看 Boost 库源代码,我注意到通常有一个单磅符号,没有任何预处理器指令附加到它们。我通读了 GCC 预处理器手册和规范指南,但找不到任何相关信息。
(1) #ifndef BOOST_CONFIG_HPP
(2) # include <boost/config.hpp>
(3) #endif
(4) #
(5) #if defined(BOOST_HAS_PRAGMA_ONCE)
(6) # pragma once
(7) #endif
在第 4 行,井号后没有任何内容。这有什么影响?它是否在 C 预处理器 (CPP) 规范中定义?
由于 Boost 是一个跨平台库,我认为任何 CPP 都应该正确解析它。在整个代码中使用随机井号/哈希符号会产生什么影响/副作用?
一
行上的#
本身根本没有效果。我认为它被用于审美价值。
C 标准说:
6.10.7 空指令
语义学
表单的预处理指令
# new-line
没有效果。
C++标准也说了同样的话:
16.7 空指令 [cpp.null]
表单的预处理指令
# new-line
没有效果。
它使源代码看起来很漂亮,仅此而已。
突出显示整个块是预处理器部分的事实。
事实上,C 和 C++ 预处理器都必须忽略一行上的#
。
始终检查权威来源,而不是依赖其他资源。C 标准化为 ISO 9899::2011,C++也有 ISO 标准。两者都被广泛接受,最终草案可以通过简短的搜索获得。C 标准在 6.10.7 中声明(C++具有大致相同的文本):
表单的预处理指令
# new-line
没有效果。
这是一个空指令,就像核心语言中没有前面表达式的;
一样是空语句。
对于预处理器,它只是为了格式/可读性,以突出显示这些行在语义上属于一起。(分号 OTOH 在语义上是相关的)。
相关文章:
- 没有为自己的结构调用列表推回方法
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- 在c++中为我自己的基于指针的数组分配内存的正确方法
- C++从对象自己的类中删除对象
- 使用 std::optional,而不是自己的结构
- 子轴围绕父轴而不是他自己的轴旋转
- 这个C++编译器优化(在自身的实例上调用对象自己的构造函数)的名称是什么,它是如何工作的?
- C++ 如何为自己的迭代器类从迭代器转换为const_iterator?
- 您应该在什么时候创建自己的异常类型
- string1 == string2 和你自己的 for 循环比较有什么区别?
- C++自己的对象堆栈.在 push() 上复制了什么?
- 在wxWidgets的事件中包含我自己的数据的最佳方法是什么?
- 我应该在服务模板中的什么位置添加自己的代码?
- 什么是编程语言支持定义您自己的自定义运算符?
- 用作自己的初始值设定项的未初始化变量的行为是什么?
- C++我自己的文件名是什么
- 编译器在尝试优化/内联我看起来微不足道但并非微不足道的 dtor 时搬起石头砸自己的脚,我做错了什么
- 在 C/C++ 预处理器中,单个井号/哈希符号 (#) 在自己的行上有什么用
- 什么时候需要声明自己的析构函数?
- 我应该做什么来执行我自己的web服务器上的php脚本