【问题标题】:Where to finding the precise meaning of a double underscore variable在哪里可以找到双下划线变量的确切含义
【发布时间】:2016-08-05 07:03:35
【问题描述】:

这个问题与C有关。关于双下划线变量的话题已经有很多问题了,例如,
What are the rules about using an underscore in a C++ identifier?
Why do people use __(double underscore) so much in C++
Meaning of double underscore in the beginning

据我所知,__myvar 保留供编译器使用。但是,我不确定在哪里可以找到这些变量的确切含义,以及如何使用它们。

例如,我正在研究这段代码:

#define fatalError(...) { char str[1000]; sprintf(str, __VA_ARGS__); printf( "%s (%s in %s, line %d)\n", str, __func__, __FILE__, __LINE__); exit(EXIT_FAILURE); }

例如,尚不清楚__VA_ARGS__ 指的是什么。由于它是编译器保留的,而且我使用的是 gcc,我应该在 gcc 文档中搜索 __VA_ARGS__ 吗?

【问题讨论】:

  • 你可以随时用谷歌搜索它,就像任何变量一样(包括那些没有双下划线的变量)

标签: c reserved-words


【解决方案1】:

这是一个variadic macros。它允许函数接受可变的参数数量。你可以阅读更多关于带有可变参数的函数here

【讨论】:

  • 感谢 Seprum - 我假设这是 gcc 特定的,即如果我尝试在 Microsoft 编译器上编译它,它不会工作,对吧?
【解决方案2】:

对于确定名称以两个下划线(或以一个下划线和一个大写字母开头;这些也是为实现保留)开头的标识符(不一定是变量名)的含义没有通用规则。

一些这样的标识符是由 C 标准定义的。例如__FILE____LINE____STDC____STDC_VERSION__(所有预定义的宏)和__func__(不是宏,而是每个函数中隐式声明的标识符)。

您可以在http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf 找到 C 标准的草案。请注意,PDF 以一种奇怪的方式对双下划线进行编码,因此它们可以正确显示,因此搜索 __STDC__ 可能会失败。您可以改为搜索_STDC_

标准中未提及的任何此类标识符都可以由实现定义(编译器或运行时库)。请查阅您的实施文档。请注意,如果实现仅将它们用于其内部目的,则可能不会记录某些此类标识符。

至于__VA_ARGS__,它由 C 标准定义,在第 6.10.3.1 节中。它用于可变参数宏(可以接受可变数量参数的宏)。它也记录在 gcc 手册中。

【讨论】:

  • 感谢 Keith 的详尽解释。尽管 gcc 手册专门针对 gcc,但很大一部分也适用于其他流行的编译器,对吧?我正在阅读预处理器上的部分,似乎 Microsoft Visual Studio 编译器的行为相似。
  • @DDC:gcc 手册中讨论__VA_ARGS__ 的部分清楚地表明这是一个ISO C 标准特性。 gcc 有另一种用于具有不同语法的可变参数宏的机制;它早于 C99。一些编译器(例如 clang)故意与 gcc 兼容; MSVS 不是。
猜你喜欢
  • 1970-01-01
  • 2012-03-22
  • 2013-05-23
  • 2014-02-18
  • 2012-05-28
  • 2012-02-13
  • 2021-08-17
  • 1970-01-01
  • 2017-10-08
相关资源
最近更新 更多