Какой C GNU-ISMS существует?
-
24-09-2019 - |
Вопрос
Я недавно недавно портировал проект от 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, когда вы тестируете базу кода.