asm
- это , а не ключевое слово стандарта C или зарезервированный идентификатор, хотя стандарт распознает его как общее расширение .Кроме того, в стандарте отмечается, что
Включение любого расширения, которое может привести к тому, что строго соответствующая программа станет недействительной, делает реализацию несовместимой.Примерами таких расширений являются новые ключевые слова, дополнительные библиотечные функции, объявленные в стандартных заголовках, или предопределенные макросы с именами, которые не начинаются с подчеркивания.
Это в Приложении J ,который является ненормативным, но он просто суммирует вывод, который можно сделать из нормативного текста.Таким образом, соответствующая реализация не будет отклонять код на том основании, что она использует asm
в качестве идентификатора.
Я считаю, что GCC, например, допускает использование asm
в качестве идентификатора при любом строгом соответствииИспользуемые им режимы используются (-std=c89
или -std=c99
или -std=c11
), но по умолчанию отклоняются с ошибкой или с специально включенными расширениями GNU (например, с -std=gnu11
).Если вы используете другой компилятор, вам нужно будет обратиться к его документации, чтобы узнать, как получить соответствие стандарту в этой области, если это действительно возможно.
Приложение
Какпочему ваша попытка CMake не удалась, свойство CMAKE_C_STANDARD
не делает то, что вы, кажется, думаете.Он сообщает CMake, если возможно, выбирать параметры компилятора, которые предоставляют функции указанной версии стандарта C, но не запрашивает строгое соответствие этому стандарту.В документах специально постулируется, что в некоторых случаях используется опция -std=gnu11
, и эти или аналогичные включающие опции будут иметь эффект, противоположный тому, что вы хотите.