Какие макросы препроцессора C уже определены в gcc?

В gcc, как я могу проверить, какие определения препроцессора C используются во время компиляции программы C, в частности, какие стандартные или специфичные для платформы определения макросов определены?


person Adrian Panasiuk    schedule 27.07.2009    source источник
comment
В gcc выполните gcc -dM -E - < /dev/null. Для MSVC есть аналогичный переключатель, но я его не помню.   -  person Joe D    schedule 12.08.2010


Ответы (3)


Предопределенные макросы зависят от стандарта и способа его реализации компилятором.

Для GCC: http://gcc.gnu.org/onlinedocs/cpp/Predefined-Macros.html

Для Microsoft Visual Studio 8: http://msdn.microsoft.com/en-us/library/b0084kay(VS.80).aspx

Эта страница Википедии http://en.wikipedia.org/wiki/C_preprocessor#Compiler-specific_predefined_macros перечисляет, как сделать дамп в некоторых предопределенных макросах

person CsTamas    schedule 27.07.2009
comment
Просто для записи ответа: gcc -dM -E - ‹ /dev/null - person Adrian Panasiuk; 27.07.2009

Вероятным источником предопределенных макросов для конкретной комбинации компилятора и платформы является проект Predef в Sourceforge. Они пытаются поддерживать каталог всех предопределенных макросов во всех компиляторах C и C++ на всех платформах. На практике они охватывают значительное количество платформ для GCC и небольшое количество других компиляторов.

Они достигли этого за счет комбинации внимательного чтения документации, а также сценария оболочки, который выясняет, какие макросы предопределены трудным путем: он пробует их. Насколько я понимаю, он фактически пробует каждую строку, которую может найти в исполняемом образе компилятора и/или препроцессора, чтобы увидеть, имеет ли она предопределенное значение.

Они с радостью добавят любую информацию, которой у них еще нет, в свою базу данных.

person RBerteig    schedule 27.07.2009

Программа может определить макрос в какой-то момент, удалить это определение позже, а затем предоставить другое определение. Таким образом, в разных точках программы макрос может иметь разные определения или вообще не иметь определения.

person Mitch Wheat    schedule 27.07.2009
comment
В целом верно для макросов, но вопрос был про предопределенные макросы - person CsTamas; 27.07.2009
comment
@CsTamas: вы говорите, что не можете отменить определение предопределенных макросов? - person Mitch Wheat; 27.07.2009
comment
@Mitch Wheat: Нет, я этого не говорю. Но вопрос был в другом. - person CsTamas; 27.07.2009
comment
Хотя ваш ответ верен, есть определенные макросы, которые определены компилятором, и было бы странно, если бы они не были определены. - person GManNickG; 27.07.2009