ASM в C выдает ошибку с -std = c99 - PullRequest
4 голосов
/ 16 апреля 2009

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

Любые подсказки могут помочь мне понять, что это значит. Я не писал эту строку, и я также не уверен, чтобы понять, какова ее цель.

Ответы [ 3 ]

12 голосов
/ 16 апреля 2009

Линия

my_type* td = ({ register my_type* arg0 asm("eax"); arg0; });

должен получить значение в регистре eax, интерпретируемом как указатель, в переменную td. Тем не менее, он использует множество расширений GNU, в частности, операторные выражения и это использование asm (явное распределение регистров). Я бы посоветовал вам переключиться на -std = gnu99 (или как там это называется). В противном случае вы можете поиграть с двойным подчеркиванием (например, asm -> __asm) или ключевым словом __extension__, но я не знаю, поможет ли это в режиме c99.

Редактировать: Я только что попробовал и просто изменив asm на __asm работает.

2 голосов
/ 16 апреля 2009

asm() не похоже на -std=c99. На мой взгляд, это плохая идея, поскольку стандарт фактически предполагает, что компиляторы поддерживают ключевое слово asm(), но это не обязательно.

Я предлагаю вам использовать -pedantic.

0 голосов
/ 16 апреля 2009

Проблема не в asm, похоже, его arg0

...