Что это за #ifdef __GNUC__?

Я нашел эти строки в коде libmagic. Что они имеют в виду?

#ifdef __GNUC__
__attribute__((unused))
#endif 

Что означает __GNUC__?
Кажется, чтобы проверить , установлен ли GCC.

Что такое __attribute__((unused))?
Здесь есть фрагмент кода, но нет объяснения: Как лучше отключить предупреждение о неиспользуемых переменных?

В чем разница между __GNUC__ и _MSC_VER?
_MSC_VER есть какое-то объяснение, но о чем все это?
Как определить, компилирую ли я код с определенной версией Visual Studio?

Напоследок вопрос:
Как я могу сделать то же самое #ifdef, чтобы проверить, какой компилятор компилирует мой код?

Ответ 1

В компиляторах обычно определяют макросы, чтобы определить, что это за компилятор, какая это версия... переносимый код C++ может использовать их, чтобы узнать, может ли он использовать определенную функцию или нет.

Что означает __GNUC__?

Это указывает на то, что я являюсь компилятором GNU, и вы можете использовать расширения GNU. [1]

Что такое __attribute__((unused))?

Этот атрибут, прикрепленный к переменной, означает, что переменная, возможно, не используется. GCC не выдаст предупреждение о неиспользованной переменной для этой переменной. [2]

В чем разница между __GNUC__ и _MSC_VER?

Это два несвязанных макроса. Первый говорит, что я компилятор GNU, а второй - номер версии компиляторов MS. Однако компиляторы MS не должны поддерживать расширения GNU.

Как я могу сделать то же самое #ifdef чтобы проверить, компилирует ли ОС мой код на Python, используя GNU и MS visual studio?

#if (defined(__GNU__) && defined(_MSC_VER))
   // ...
#endif

Ответ 2

Различные компиляторы поддерживают разные функции, иногда по-разному. Вы обнаруживаете серию блоков #ifdef, чтобы включить поддержку в соответствии с тем, какой компилятор создает код; например, компилятор GNU автоматически определяет __GNUC__. __CC_ARM, __ICCARM__, __GNUC__, __TASKING__ определяются определенными компиляторами, проект был перенесен и заинтересован в.

Ввод __attribute__((unused)) является индикатором, специфичным для GNU (хотя другие компиляторы также могут поддерживать это сейчас), чтобы заявить, что прикрепленный к нему символ может не использоваться и поэтому компилятор должен предупредить вас об этом состоянии.

Что касается использования этих ifdefs для определения того, какой компилятор создает ваш код, сделайте это так же, как вы читаете в другом проекте для построения C. Это не факторы для вашего кода на Python.