在 C++ 标识符中使用下划线的规则是什么?

2024-02-26

在 C++ 中,使用某种前缀来命名成员变量是很常见的,以表示它们是成员变量,而不是局部变量或参数。如果您有 MFC 背景,您可能会使用m_foo。我也见过myFoo偶尔。

C#(或者可能只是 .NET)似乎建议仅使用下划线,如下所示_foo。 C++ 标准允许这样做吗?


规则(在 C++11 中没有改变):

  • Reserved in any scope, including for use as implementation https://stackoverflow.com/questions/4297933/c-implementation#4297974 macros:
    • 以下划线开头,后跟大写字母的标识符
    • 包含相邻下划线(或“双下划线”)的标识符
  • Reserved in the global namespace:
    • 以下划线开头的标识符
  • 此外,所有内容都在std命名空间被保留。 (不过,您可以添加模板专业化。)

来自 2003 年 C++ 标准:

17.4.3.1.2 全局名称 [lib.global.names]

某些名称和函数签名集始终保留给实现:

  • 每个包含双下划线的名称 (__)或以下划线开头,后跟大写字母(2.11)保留给实现以供任何使用。
  • Each name that begins with an underscore is reserved to the implementation for use as a name in the global namespace.165

165) Such names are also reserved in namespace ::std (17.4.3.1).

C++ 语言基于 C 语言(1.1/2、C++03),而 C99 是规范性参考(1.2/1、C++03),因此了解 1999 C 标准的限制很有用(尽管它们并不直接适用于 C++):

7.1.3 保留标识符

每个标头声明或定义其相关子条款中列出的所有标识符,并且 可选地声明或定义在其关联的未来库方向子条款中列出的标识符和标识符,这些标识符始终保留用于任何用途或用作文件范围标识符。

  • 所有以下划线和大写字母或其他字母开头的标识符 下划线始终保留用于任何用途。
  • 所有以下划线开头的标识符始终保留用作标识符 文件范围位于普通名称空间和标记名称空间中。
  • 以下任何子条款中的每个宏名称(包括未来的库 如果包含任何相关标头,则保留按指定使用; 除非另有明确说明(见 7.1.4)。
  • All identifiers with external linkage in any of the following subclauses (including the future library directions) are always reserved for use as identifiers with external linkage.154
  • 以下任何子条款中列出的具有文件范围的每个标识符(包括 未来的库方向)被保留用作宏名称和标识符 如果包含任何关联的标头,则文件范围位于同一名称空间中。

没有保留其他标识符。如果程序在a中声明或定义了一个标识符 保留它的上下文(7.1.4 允许的除外),或定义一个保留的 标识符作为宏名称,行为未定义。

如果程序删除(用#undef) 第一个标识符的任何宏定义 上面列出的组,行为未定义。

154) The list of reserved identifiers with external linkage includes errno, math_errhandling, setjmp, and va_end.

其他限制可能适用。例如,POSIX 标准保留了许多可能出现在正常代码中的标识符:

  • 以大写字母开头的名字E后跟数字或大写字母:
  • 可用于其他错误代码名称。
  • 以以下任一开头的名称is or to后面跟着一个小写字母
  • 可用于附加的字符测试和转换功能。
  • 以以下开头的名称LC_后跟一个大写字母
  • 可用于指定区域设置属性的附加宏。
  • 所有现有数学函数的名称以f or l已保留
  • 对于分别对 float 和 long double 参数进行操作的相应函数。
  • 以以下开头的名称SIG后面跟着一个大写字母是保留的
  • 获取附加信号名称。
  • 以以下开头的名称SIG_后面跟着一个大写字母是保留的
  • 用于附加信号操作。
  • 名称开头为str, mem, or wcs后面跟着一个小写字母是保留的
  • 用于其他字符串和数组函数。
  • 名称开头为PRI or SCN后跟任何小写字母或X已保留
  • 用于附加格式说明符宏
  • 以以下结尾的名称_t已保留
  • 用于其他类型名称。

虽然现在将这些名称用于您自己的目的可能不会造成问题,但它们确实会增加与该标准的未来版本发生冲突的可能性。


就我个人而言,我只是不使用下划线开头标识符。我的规则的新补充:不要在任何地方使用双下划线,这很容易,因为我很少使用下划线。

对本文进行研究后,我不再以标识符结尾_t因为这是 POSIX 标准保留的。

关于以任何结尾的标识符的规则_t让我很惊讶。我认为这是一个 POSIX 标准(尚未确定),正在寻求澄清和官方章节。这是来自GNU libtool 手册 http://www.gnu.org/software/libtool/manual/libc/Reserved-Names.html,列出保留名称。

CesarB 提供了以下链接POSIX 2004 http://www.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_02.html保留符号并注释“许多其他保留前缀和后缀......可以在那里找到”。这POSIX 2008 http://www.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html保留符号在这里定义。这些限制比上述限制更为细致。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C++ 标识符中使用下划线的规则是什么? 的相关文章

  • 用于代数简化和求解的 C# 库 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 网络上有很多代数求解器和简化器 例如 algebra com 上不错的代数求解器和简化器 然而 我正在
  • 注销租约抛出 InvalidOperationException

    我有一个使用插件的应用程序 我在另一个应用程序域中加载插件 我使用 RemoteHandle 类http www pocketsilicon com post Things That Make My Life Hell Part 1 App
  • 如何在 .NET Framework 2.0 中模拟“Func<(Of <(TResult>)>) 委托”?

    我尝试使用这个类代码项目文章 http www codeproject com KB threads AsyncVar aspx在 VB NET 和 NET Framework 2 0 中 除了这一行之外 所有内容似乎都可以编译Privat
  • 如何将非静态类成员“std::bind”绑定到 Win32 回调函数“WNDPROC”?

    我正在尝试将非静态类成员绑定到标准WNDPROC http msdn microsoft com en us library ms633573 aspx功能 我知道我可以通过将类成员设为静态来简单地做到这一点 但是 作为一名 C 11 ST
  • 确保 StreamReader 不会挂起等待数据

    下面的代码读取从 tcp 客户端流读取的所有内容 并且在下一次迭代中它将仅位于 Read 上 我假设正在等待数据 我如何确保它不会在没有任何内容可供读取时返回 我是否必须设置低超时 并在失败时响应异常 或者有更好的办法吗 TcpClient
  • ClickOnce 应用程序错误:部署和应用程序没有匹配的安全区域

    我在 IE 中使用 FireFox 和 Chrome 的 ClickOnce 应用程序时遇到问题 它工作正常 异常的详细信息是 PLATFORM VERSION INFO Windows 6 1 7600 0 Win32NT Common
  • C中的malloc内存分配方案

    我在 C 中尝试使用 malloc 发现 malloc 在分配了一些内存后浪费了一些空间 下面是我用来测试 malloc 的一段代码 include
  • 错误:表达式不产生值

    我尝试将以下 C 代码转换为 VB NET 但在编译代码时出现 表达式不产生值 错误 C Code return Fluently Configure Mappings m gt m FluentMappings AddFromAssemb
  • 单个对象的 Monogame XNA 变换矩阵?

    我读过一些解释 XNA Monogame 变换矩阵的教程 问题是这些矩阵应用于 SpriteBatch Begin matrix 这意味着所有 Draw 代码都将被转换 如何将变换矩阵应用于单个可绘制对象 就我而言 我想转换滚动背景 使其自
  • 将 Word 文档另存为图像

    我正在使用下面的代码将 Word 文档转换为图像文件 但是图片显得太大 内容不适合 有没有办法渲染图片或将图片保存到合适的尺寸 private void btnConvert Click object sender EventArgs e
  • 标准化 UTF-8 到底是什么?

    The 重症监护室项目 http userguide icu project org transforms normalization 现在也有一个PHP库 http us php net manual en class normalize
  • 我可以使用 moq Mock 来模拟类而不是接口吗?

    正在经历https github com Moq moq4 wiki Quickstart https github com Moq moq4 wiki Quickstart 我看到它 Mock 一个接口 我的遗留代码中有一个没有接口的类
  • Qt - ubuntu中的串口名称

    我在 Ubuntu 上查找串行端口名称时遇到问题 如您所知 为了在 Windows 上读取串口 我们可以使用以下代码 serial gt setPortName com3 但是当我在 Ubuntu 上编译这段代码时 我无法使用这段代码 se
  • 使用自定义堆的类似 malloc 的函数

    如果我希望使用自定义预分配堆构造类似 malloc 的功能 那么 C 中最好的方法是什么 我的具体问题是 我有一个可映射 类似内存 的设备 已将其放入我的地址空间中 但我需要获得一种更灵活的方式来使用该内存来存储将随着时间的推移分配和释放的
  • C# 中的合并运算符?

    我想我记得看到过类似的东西 三元运算符 http msdn microsoft com en us library ty67wk28 28VS 80 29 aspx在 C 中 它只有两部分 如果变量值不为空 则返回变量值 如果为空 则返回默
  • 将 MQTTNet 服务器与 MQTT.js 客户端结合使用

    我已经启动了一个 MQTT 服务器 就像this https github com chkr1011 MQTTnet tree master例子 该代码托管在 ASP Net Core 2 0 应用程序中 但我尝试过控制台应用程序 但没有成
  • 如何在非控制台应用程序中查看 cout 输出?

    输出到调试窗口似乎相当繁琐 我在哪里可以找到cout如果我正在编写非控制台信息 则输出 Like double i a b cout lt lt b lt lt endl I want to check out whether b is z
  • 使用 C# 读取 Soap 消息

  • 如何部署“SQL Server Express + EF”应用程序

    这是我第一次部署使用 SQL Server Express 数据库的应用程序 我首先使用实体 框架模型来联系数据库 我使用 Install Shield 创建了一个安装向导来安装应用程序 这些是我在目标计算机中安装应用程序所执行的步骤 安装
  • 我的班级应该订阅自己的公共活动吗?

    我正在使用 C 3 0 遵循标准事件模式我有 public event EventHandler

随机推荐

  • Typo3 CKEditor 图片来自 FAL

    我使用 CKEditor 设置了全新的 TYPO3 8 7 4 安装 并且rte ckeditor image从 FAL 获取图像 在文档中rte ckeditor image它说 最大尺寸与魔法图像的配置有关 必须在 Page TSCon
  • npm 错误“Keccak 绑定编译失败。”安装松露时

    我尝试安装 Truffle 但出现以下错误 npm install g truffle C Users dany vandermeij AppData Roaming npm truffle gt C Users dany vanderme
  • 以编程方式在其他视图的底部添加子视图

    我创建了一个 UIView 并通过界面生成器向其中添加了一些 UIlabel 我想以编程方式将 UIView 添加到此视图 self view addSubview newView 问题是 newView 隐藏了我使用界面生成器创建的部分标
  • 从 Google+ API json 结果中的对象 -> 内容末尾删除“\ufeff”

    Google API 的结果是 ufeff附加到每个 内容 结果的末尾 我真的不知道为什么 从 json 结果中删除此 unicode 字符的最佳方法是什么 它正在生产一个 在我显示的一些输出中 例子 https developers go
  • 在除以零的中断处理程序中该怎么做?

    操作系统中断处理程序应该如何处理与编码错误相关的中断 例如 我尝试除以 0 来测试我的中断 但我的中断处理程序被调用 然而 由于 div 指令没有成功执行 EIP 不会更新到它之后的下一条指令以及从中断处理程序返回后iret 它又回到了错误
  • 大表中的行数

    SELECT COUNT FROM BigTable 1 如果我的行数超过 10 亿 我应该使用哪种方式来获取表中的行数 更新 例如 如果上面的查询出现 超时问题 有什么方法可以优化它 怎样才能做得更快呢 如果您需要精确的计数 则必须使用C
  • 每次执行 make 先决条件

    我的生成文件 PHONY test unit test functional mocha test test unit test functional test unit SUITE unit test unit mocha echo un
  • 部署概念:打包 JAR 依赖项、何时以及为何

    因此 我对 Java EE 比较陌生 并且很难理解 Java 部署文件何时 何地以及为何与其依赖项一起打包 假设我将我的项目构建为myapp jar 并且依赖于 fizz jar buzz jar 和 JODA joda time 2 0
  • 清理 Python 模块并重新启动 Mac OS X

    我不是一个完全的新手 但我尝试安装模块很长一段时间 此时我想重新开始并安装 python 和我需要的所有模块 这样我才能真正理解它们 我的问题是 其中一些导入 但大多数安装到错误的站点包或不导入 可能是因为我弄乱了我的系统 python 我
  • 在Java或Android中将Mat(OpenCV)数据类型写入csv文件

    我喜欢将 Mat 类型数据从 OpenCV 提取到 csv 文件 我可以从 Mat 到字节数组 然后我写入文本文件 但我从未获得完整图像 始终获取图像的一部分 可能出什么问题了 printtoTextFile Mat d File file
  • R:在查询图形参数时防止 par() 打开新窗口

    这个问题说明了一切 有时您需要进行初步计算来格式化绘图 并且您不希望显示窗口 最重要的是抢走焦点 例如 假设您想知道用作边距的行的高度 您可能需要使用 par mai par mar 我经常查询图形参数来定义图形输出 但发现弹出的窗口分散注
  • 为什么我无法在 asp:CheckBox 上设置值?

    没有这个属性Value
  • Slickgrid 水平滚动条覆盖最后一行

    当 Slickgrid 包含在div具有固定宽度和水平滚动条变得必要 该滚动条覆盖最后一行数据 http jsfiddle net ericjohannsen LtsvJ http jsfiddle net ericjohannsen Lt
  • 如何使用 GDAL 从 tiff 和 4 个角纬度和经度创建 geotiff [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一张没有 TIFF 格式地理数据的图像 地图 我需要从我的图像中获取 GeoTIFF 文件 我的地
  • 为什么 tomcat 的数据库连接池有两个选项(tomcat-dbcp 和 tomcat-jdbc)?

    我想将数据库连接池添加到现有应用程序 我找到了两个基于tomcat的库tomcat dbcp and tomcat jdbc 我刚刚遇到麻烦了 我应该选择哪一个 总之 Tomcat 提交团队成员的注释 请参阅here https bz ap
  • 使用私有构造函数实例化内部类

    我正在尝试使用反射来创建类的实例 但它是内部密封的并且有私有构造函数 我想知道如何初始化它 并且作为框架的一部分 我只能使用反射将其取出 internal sealed class ABC private ABC string passwo
  • 为什么“pip3 install netifaces”在 Debian 10 Buster 上失败?

    我在 AWS EC2 上设置了一个新的 Debian 10 Buster 实例 并且能够安装依赖于 netifaces 的 pip3 软件包 但是当我第二天返回时 该软件包崩溃并报告 netifaces 中的错误 如果我尝试运行 pip3
  • iPhone 应用内购买商店工具包错误 -1003“无法连接到 iTunes Store”

    我一直致力于添加应用内购买 并且能够使用 Store Kit 创建和测试应用内购买 耶 在测试过程中 我以一种导致应用程序在购买过程中崩溃的方式运行了我的应用程序 所以我猜接收 paymentQueue updatedTransaction
  • Bash 命令替换给出奇怪的不一致输出

    由于与此问题无关的某些原因 我不是直接在 bash 脚本中运行 Java 服务器 而是通过单独的子 shell 下的命令替换在后台运行 该子命令的目的是返回 Java 服务器的进程 ID 作为其标准输出 有问题的片段如下 launch da
  • 在 C++ 标识符中使用下划线的规则是什么?

    在 C 中 使用某种前缀来命名成员变量是很常见的 以表示它们是成员变量 而不是局部变量或参数 如果您有 MFC 背景 您可能会使用m foo 我也见过myFoo偶尔 C 或者可能只是 NET 似乎建议仅使用下划线 如下所示 foo C 标准