ASM в C выдает ошибку с -std=c99
-
09-09-2019 - |
Вопрос
Теперь я готов скомпилировать свой проект с помощью -std=c99
и я столкнулся с ошибкой, которую пока не понимаю.Эта строка:
my_type* td = ({ register kmy_type* arg0 asm("eax"); arg0; });
дает мне следующую ошибку только в C99:
warning: ISO C forbids nested functions
error: syntax error before ‘asm’
error: ‘arg0’ undeclared (first use in this function)
error: (Each undeclared identifier is reported only once
error: for each function it appears in.)
warning: ISO C forbids braced-groups within expressions
Любые подсказки приветствуются, чтобы помочь мне понять, что это значит.Я не писал эту строку и тоже не совсем понимаю, какова ее цель.
Решение
Линия
my_type* td = ({ register my_type* arg0 asm("eax"); arg0; });
должно получить значение в eax
регистр, интерпретируемый как указатель, в td
переменная.Однако он использует множество расширений GNU, особенно выражения операторов и такое использование asm
(явное выделение регистров).Я бы посоветовал вам переключиться на -std=gnu99 (или как там это называется).В противном случае вы можете использовать двойное подчеркивание (например. asm
-> __asm
) или __extension__
ключевое слово, но не знаю, поможет ли оно в режиме c99.
Редактировать:Я только что попробовал и просто изменил asm
к __asm
работает.
Другие советы
asm()
кажется, не работает с -std=c99
.На мой взгляд, это плохая идея, поскольку стандарт фактически предполагает, что компиляторы поддерживают asm()
ключевое слово, но оно не является обязательным.
Я предлагаю вам использовать -pedantic
вместо.
Проблема там не в asm, похоже это arg0