2014-06-20 4 views
0

Что делает __G в C?Что означает «__G»?

Я использую GCC 4.9.

Я использую последнюю версию MinGW.

Я компилирую с -std=gnu11.

У меня есть следующий C (компилируемый с GCC как C11) Код:

#ifndef __G 
#define __G 0 
#endif 

Это компилирует нормально.

Но сейчас, во время компиляции с последней MinGW, я получаю следующее:

In file included from ../common/sysbase/sysbase.h:6:0, 
      from Monitor.c:5: 
../common/sysbase/sysbase_chk.h:3:13: error: expected ';', ',' or ')' before numeric constant 
#define __G 0 

compilation terminated due to -Wfatal-errors. 

GCC под MinGW64, похоже, использует `__G для чего-то.

Я не мог найти его ни в каком заголовке.

+2

Это идентификатор. Это тот, который зарезервирован для реализации, поэтому вы не должны использовать его в своем собственном коде; либо компилятор, либо заголовок, входящий в стандартную библиотеку, может свободно определять его в своих целях. –

+0

Но знаете ли вы, из какого API/стандарта он исходит? – user3525723

+0

Я знаю, что идентификаторы, начинающиеся с «__», считаются зарезервированными словами. Но мое использование здесь просто! Я создаю API, и я использую «__G» и «__LE» в качестве макросов, чтобы определить способ хранения слов в памяти на целевой машине ... Теперь, после более чем года сбора кодов с этими заголовками, мне придется изменить aaalll мои коды? :( – user3525723

ответ

4

__G - это просто идентификатор. Я не знаю о его стандартном использовании, но поскольку он начинается с двух символов подчеркивания, он зарезервирован для реализации для всех целей. Слово «реализация» здесь относится к компилятору и библиотеке C, а не коду, который вы пишете (если вы сами не выполняете часть компилятора или C-стандартной библиотеки).

(В стандарте указано, что любой идентификатор, начинающийся с два символа подчеркивания или с символом подчеркивания и заглавной буквой зарезервированы для любого использования, любой идентификатор, начинающийся с символа подчеркивания, зарезервирован для использования с объемом файла. См. раздел 7.1.3 из N1570 C standard draft.)

Нельзя использовать это в вашем собственном коде. Это приводит к тому, что поведение вашей программы не определено.

Реализация C (либо компилятор, компоновщик, заголовок, либо библиотека) разрешает определять __G любым способом, который ему нравится. Видимо, это то, с чем вы столкнулись.

В ответ на вопрос, в ваш комментарий:

Теперь, после того, как более года компиляции кода с этими заголовками, мне придется изменить aaalll моих кодов?

Да, это именно то, что я говорю. Ваше использование __G всегда было неправильным; вы просто не сталкивались с видимыми симптомами до сих пор.

(Это по крайней мере, возможно, что предыдущие версии MinGW определили его каким-то образом, что не вызывает ваш код не компилируется, но это может иметь причиной его безобразничать.)

+2

Можно добавить, что' _G' будет одинаково зарезервирован, так как начинается с подчеркивания и заглавной буквы. –