Подстановка токена препроцессора C завершается с ошибкой разбора - PullRequest
0 голосов
/ 01 февраля 2011

Я определил следующие макросы в моей C программе:

#define ISE1  "cust_add"
#define ISE2  "cust_sub"

#define ise_inst(inst, a, b, c) \
asm volatile (
" " inst " %1, %2, %0          \n\t" \
: "=r" (c) \
: "r" (a), "r" (b) \
: "%g0" \
)

В основной процедуре я вызываю макрос со следующими параметрами:

ise_inst(ISE1, inp1, inp2, res);

В идеале, препроцессор должен расширять все это так, чтобы я получил следующий результат:

asm volatile (
" cust_add %1, %2, %0          \n\t"
: "=r" (res)            
: "r" (inp1), "r" (inp2)         
: "%g0"                                                   
); 

Кто-нибудь знает, что я сделал не так? На данный момент препроцессор сообщает мне

ошибка: ошибка разбора перед строковой константой (@ line: "" inst "% 1,% 2,% 0 \ n \ t")

Ответы [ 3 ]

3 голосов
/ 01 февраля 2011

Похоже, вам не хватает символа продолжения строки \ после строки asm volatile(.

1 голос
/ 01 февраля 2011

Помимо пропущенного \, ваша инструкция на ассемблере должна быть приведена в строчку так:

#define ise_inst(inst, a, b, c)       \
asm volatile (                        \
" " #inst " %1, %2, %0          \n\t" \
: "=r" (c)                            \
: "r" (a), "r" (b)                    \
: "%g0"                               \
)

Обратите внимание на маленький # перед inst. Если вы затем вызовете свой макрос с ISE1, это расширится до "ISE1".

0 голосов
/ 01 февраля 2011

Разве вы не забыли про символ обратной косой черты (\) после asm volatile (?

...