Обернуть парс вокруг него.
(abs)(whatever);
Это заставит компилятор использовать версию функции, поскольку макрос больше не совпадает.
Функциональные макросы работают путем сопоставления идентификатора, за которым следует левый парень (
. Поскольку мы обернули имя функции в parens, вместо этого вместо этого будет идентификатор, за которым следует правый параграф )
, который не соответствует макросу. Parens являются семантически прозрачными, но они препятствуют синтаксису макроса.
IIRC, это был splint
контролер C, который преподавал это мне. При написании интерпретатора постскрипта я создал красивые короткие макросы для доступа к стеку.
#define push(o) (*tos++ = (o))
#define pop() (*--tos)
которые были велики до хитрых частей, где они были частью выражения с участием tos
. Чтобы избежать неопределенного поведения, мне пришлось создавать функциональные версии и использовать их для этих сложных пятен. Для нового дизайна я полностью пропустил макросы.
Edit: У меня есть мучительное чувство, что это было на самом деле книга Coelocanthe (Deep Secrets Питер Ван дер Линден C), где я узнал об этом, вышеописанной ситуации бытия, где я первый нужно его , IIRC в его примере участвовали putchar
или getchar
, которые часто реализуются как обе функции, так и макросы в соответствии с реализациями C.
Имеет ли библиотека 'complex' пространство имен? – juanchopanza
Да, пространство имен является std. Я использую libray «complex» стандартного C99 – user2194381
'std' - это пространство имен C++. – juanchopanza