Директивы препроцессора не участвуют в этом вопросе. Проблемы:
asm(…)
- это расширение G CC для языка C. G CC обрабатывает asm
, за которым следует ;
, как выражение . - Круглые скобки являются частями выражений. Когда вы пишете
(…)
, содержимое скобок должно быть выражением. Поскольку asm
не является выражением, (asm(…);)
является ошибкой. - G CC имеет расширение, называемое выражениями оператора , в котором
({…})
имеет значение как выражение, но может содержать операторы. Внутри ({…})
вы можете поместить операторы в фигурные скобки, и G CC будет их оценивать и использовать в них значение последнего выражения выражения 1 в качестве значения ({…})
выражение. (Последнее выражение в ({…})
должно быть выражением-выражением, в отличие от какого-либо другого типа выражения, подобно for
l oop.)
Таким образом, ({ asm(…); })
принимается как выражение.
Однако, хотя G CC принимает его, оно нарушает утверждение в документации GCC о том, что «последним в составном выражении должно быть выражение, за которым следует точка с запятой…». Не похоже, что ваш макрос предназначен для использования в качестве выражения; он помещает результат в res
, но сам по себе не имеет значения. В этом случае вы можете сделать это просто заявлением, удалив скобки из исходного кода:
#define GREATER(a, b, res) \
asm("cmp %1, %2\n\t" \
"jge 0f\n\t" \
"movl %1, %0\n\t" \
"jmp 1f\n" \
"0:\n\t" \
"movl %2, %0\n" \
"1:" \
: "=r"(res) \
: "r"(a), "r"(b));
Кроме того, люди часто предпочитают опускать окончательный ;
в таких макросах, потому что тогда макрос может быть написано как утверждение, когда используется в исходном коде:
GREATER(a, b, res);
вместо того, чтобы выглядеть странным для людей, привыкших к утверждениям, заканчивающимся на ;
:
GREATER(a, b, res)
(хотя с ;
в определении, вы все равно можете написать GREATER(a, b, res);
, но это расширится до ;;
, и это может вызвать проблемы, потому что if (foo) GREATER(a, b, res); else…
не сможет связать это else
с этим if
из-за дополнительный ;
.)
Сноска
1 A выражение выражение - это выражение, за которым следует ;
.