阅读anwser 有关在ac标识符中使用下划线的规则我偶然发现了下面的引文:
从2003 C++标准:
17.4.3.2.1全局名称[lib.global.names]
某些名称和函数签名集始终保留给实现:
- 每个包含双下划线(_ _)或以下划线后跟大写字母(2.11)开头的名称都保留给实现以供任何使用.
- 以下划线开头的每个名称都保留给实现,以用作全局名称空间中的名称.165
165)这些名称也在namespace :: std(17.4.3.1)中保留.
保留用于实现的确切含义是什么?
"实现"指的是"C++语言的实现".它包含执行C++程序所需的一切:编译器,标准库,要执行的硬件,操作系统,可视化系统,输入等.
有问题的限制意味着您的编译器可能会在不告知您的情况下预定义保留表单的名称,或者您的标准库实现可能会这样做.例如,您的标准库可能会定义一个宏__Foo,因此如果您尝试__Foo在源代码中用作标识符,那么实际上您最终会使用宏替换.
保留名称的目的是为您的编译器和标准库提供在纯C++中表达功能的自由,而不必担心引入与用户代码的名称冲突.
有关如何在实践中使用它的生动示例,请查看标准库实现的任何头文件.
有些保留名称实际上已经制作成定义良好的,可公开获得的设施:__FILE__,__cplusplus,__VA_ARGS__,仅举几例.C语言(具有与保留标识相同的规则)一直使用保留名称来引入新关键字(例如_Bool).
这里的实现意味着编译器(比如gcc,msvc等),标准库(表示语言中包含哪些功能),操作系统(Windows,Mac等)和硬件(Intel,ARM等)的组合.
根据实现,定义了某些值,编译器使用这些值来生成特定于实现的目标代码.例如
__TARGET_ARCH_ARM is defined by RealView #Matches first case
_M_ARM is defined by Visual Studio #Matches second case
Run Code Online (Sandbox Code Playgroud)
识别CPU制造商.
简而言之,这些条款旨在阻止您使用上述格式的宏.
事实上,n3797-> 17.6.5.3对宏定义的限制说,如果你想定义上述格式的宏,它们是:
除非另有明确说明,否则适用于#if预处理指令.
示例:
#ifndef _M_ARM
#define _M_ARM // Say you're compiling for another platform
#endif
Run Code Online (Sandbox Code Playgroud)
注意
保留用于实现的宏不限于所提到的格式.例如__arm__,由gcc定义以识别制造商.
| 归档时间: |
|
| 查看次数: |
566 次 |
| 最近记录: |