Я всегда думал, что это так, но многие IDE и инструменты подсветки синтаксиса не выделяют ASM в C, но они всегда делают с C ++. Является ли встроенная сборка частью стандарта C (ANSII или ISO) или нет?
Это не входит в стандарт ISO C (проект N1570 C2011) как таковой, но упоминается в приложении J (общие расширения):
J.5.10 Ключевое слово asm
1 Ключевое слово asm может использоваться для вставки ассемблера непосредственно в вывод транслятора (6.8). Наиболее распространенной реализацией является утверждение в форме:
asm ( character-string-literal );
Приложение J является информативным, а не нормативным, поэтому реализация не должна предусматривать встроенную сборку, и, если это происходит, не указано, в какой форме. Но это широко распространенное расширение, хотя и не переносимое, поскольку компиляторы действительно реализуют его по-разному.
В стандарте C ++ (черновой вариант стандарта C ++ 11 n3376) он упоминается в основной части стандарта.
7.4. Объявление asm [Dcl.asm]
1 ASM декларация имеет вид
ASM-определение:
asm ( string-literal ) ;
Объявление asm условно поддерживается; его значение определяется реализацией. [Примечание: как правило,
он используется для передачи информации через реализацию ассемблеру. — конец примечания]
но также не обязательно, и с интерпретацией, определенной реализацией.
Вопреки распространенному мнению, asm
является в собственно стандарте C ++, но его поддержка носит условный характер. §7.4 / 1:
ASM декларация имеет вид
ASM-определение:
asm ( string-literal ) ;
Объявление asm условно поддерживается; его смысл — реализация
определены.
Тем не менее, «условно поддерживаемый» означает, что вы не можете зависеть от конкретного компилятора, поддерживающего это вообще. Microsoft (для одного очевидного примера) использует _asm
вместо ключевого слова, но с совершенно другим синтаксисом (язык ассемблера заключен в фигурные скобки вместо строкового литерала).
Нет — встроенный asm является распространенным расширением, но нестандартным (и довольно часто реализуемым по-разному разными поставщиками).