Какие 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 при тестировании базы кода.