Вопрос

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

Это было полезно?

Решение

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

http://gcc.gnu.org/onlinedocs/gcc-4.2.0/gcc/c-extensions.html.

Другие советы

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

 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, когда вы тестируете базу кода.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top