Где найти точное значение переменной с двойным подчеркиванием

Этот вопрос относится к C. Уже было много вопросов по теме переменных с двойным подчеркиванием, например,
Каковы правила использования подчеркивания в идентификаторе C++?
Почему люди так часто используют __(двойное подчеркивание) в C++
Значение двойного подчеркивания в начале

Насколько я понимаю, __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, должен ли я искать __VA_ARGS__ в документации gcc?


person DDC    schedule 13.04.2016    source источник
comment
Вы всегда можете использовать Google, как и для любой переменной (включая те, у которых нет двойного подчеркивания)   -  person user253751    schedule 14.04.2016


Ответы (2)


Не существует общего правила для определения значения идентификатора (не обязательно имени переменной), имя которого начинается с двух символов подчеркивания (или с подчеркивания и буквы в верхнем регистре; они также зарезервированы для реализации).

Некоторые такие идентификаторы определены стандартом C. Примеры: __FILE__, __LINE__, __STDC__, __STDC_VERSION__ (все предопределенные макросы) и __func__ (не макрос, а неявно объявленный идентификатор в каждой функции).

Вы можете найти проект стандарта C по адресу http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf. Обратите внимание, что PDF кодирует двойные символы подчеркивания странным образом, поэтому они отображаются правильно, поэтому поиск __STDC__, скорее всего, завершится ошибкой. Вместо этого вы можете искать _STDC_.

Любые такие идентификаторы, не упомянутые в стандарте, могут быть определены реализацией (либо компилятором, либо библиотекой времени выполнения). Обратитесь к документации по реализации. Имейте в виду, что некоторые такие идентификаторы могут быть не задокументированы, если реализация использует их только для своих внутренних целей.

Что касается __VA_ARGS__, это определено стандартом C в разделе 6.10.3.1. Он используется в вариативных макросах (макросах, которые могут принимать переменное количество аргументов). Это также задокументировано в руководстве gcc.

person Keith Thompson    schedule 13.04.2016
comment
Спасибо, Кит, за подробное объяснение. Несмотря на то, что руководство по gcc относится именно к gcc, большая его часть применима и к другим популярным компиляторам, верно? Я читаю часть о препроцессоре, и кажется, что поведение компилятора Microsoft Visual Studio похоже. - person DDC; 14.04.2016
comment
@DDC: раздел руководства gcc, в котором обсуждается __VA_ARGS__, ясно говорит, что это стандартная функция ISO C. gcc имеет другой механизм для вариативных макросов с другим синтаксисом; он предшествует C99. Некоторые компиляторы (например, clang) намеренно совместимы с gcc; МСВС нет. - person Keith Thompson; 14.04.2016

Это вариативные макросы. Это позволяет функции принимать переменное количество аргументов. Подробнее о функциях с переменными аргументами можно прочитать здесь.

person Vladyslav    schedule 13.04.2016
comment
Спасибо, Seprum - я предполагаю, что это специфично для gcc, т.е. если я попытаюсь скомпилировать это на компиляторе Microsoft, это не сработает, верно? - person DDC; 14.04.2016