Вопрос

Теперь я готов скомпилировать свой проект с помощью -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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top