Какие C GNU-измы существуют?

Недавно я переносил проект из GCC в Clang(в котором я исправил несколько C GNU-измов). Это заставило меня задуматься: какие существуют C-GNU-измы (расширения языка C, поддерживаемые в GCC, которые не стандартизированы)? Есть ли где-нибудь исчерпывающий список?

3 ответа

Решение

Вот довольно полный список прямо с сайта GCC. Кажется, их довольно много, поэтому я желаю вам удачи, просматривая их!

http://gcc.gnu.org/onlinedocs/gcc-4.2.0/gcc/C-Extensions.html

Одним из самых хороших GNU-объектов, которые я нашел, было явное объявление ключей при заполнении структур.

 struct canmsg_t {
      short     flags;
      int       cob;
      canmsg_id_t   id;
      unsigned long timestamp;
      unsigned int  length;
      unsigned char data[CAN_MSG_LENGTH];
 };

 canmsg_t msg = 
 {
      ["flags"] = 0x00;
      ["cob"]   = 0;
      ["id"]    = 0x534;
      ["timestamp"] = 0;
      ["length"] = 1;
      ["data"] = { 0 };
 }

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

Хотя существует множество расширений, и я полагаюсь на ответ Беты за это, маловероятно, что ваш проект опирается на многие из них. Можно отключить расширения в сборке GNU, поэтому простое выполнение этого даст вам предварительное предупреждение о любых потенциальных несовместимостях в вашей кодовой базе.

Вы можете столкнуться с другими проблемами, такими как тот факт, что GCC поддерживает большинство функций C99, в то время как некоторые популярные компиляторы этого не делают (в частности, Microsoft VC++). Поэтому вы можете отключить функции C99 при тестировании базы кода.

Другие вопросы по тегам