在哪里可以找到双下划线变量的确切含义

Where to finding the precise meaning of a double underscore variable

这个问题属于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__ 吗?

这是一个variadic macros. It allows the function to take variable ammout of arguments. You can read more about functions with variable arguments here

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

一些这样的标识符是由 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 手册中。