Какие C GNU-измы существуют? - PullRequest
3 голосов
/ 30 января 2010

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

Ответы [ 3 ]

8 голосов
/ 30 января 2010

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

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

0 голосов
/ 01 февраля 2010

Одним из самых хороших 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 структурах элементов это становится бесценным.

0 голосов
/ 30 января 2010

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

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

...