Директива препроцессора используется в аргументе к функциональному макросу
Этот дефект возникает при использовании директивы препроцессора в аргументе к функциональному макросу или функции, которая может быть реализована как функциональный макрос.
Например, #ifdef оператор встречается в аргументе для memcpy функция. memcpy функция может быть реализована как макрос.
memcpy(dest, src,
#ifdef PLATFORM1
12
#else
24
#endif
);printf и assert, которые также могут быть реализованы в виде макросов.Во время предварительной обработки функциональный макро-вызов заменяется телом макроса, а параметры заменяются аргументами к макро-вызову (подстановка аргумента). Предположим, макрос min() определяется следующим образом.
#define min(X, Y) ((X) < (Y) ? (X) : (Y))
min(1,2), его заменяет кузов ((X) < (Y) ? (X) : (Y)). X и Y заменены на 1 и 2.Согласно C11 Standard (Sec. 6.10.3), если список аргументов для самого функционально-подобного макроса имеет директивы предварительной обработки, подстановка аргументов во время предварительной обработки не определена.
Чтобы обеспечить однозначное замещение аргумента, используйте директивы препроцессора вне функционально-подобного макроса.
Например, для выполнения memcpy с различными аргументами, основанными на #ifdef директива, вызов memcpy несколько раз в пределах #ifdef ветки директивы.
#ifdef PLATFORM1
memcpy(dest, src, 12);
#else
memcpy(dest, src, 24);
#endif| Группа: Программирование |
| Язык: C | C++ |
| По умолчанию: Вкл для рукописного кода, выкл для сгенерированного кода |
Синтаксис командной строки:
PRE_DIRECTIVE_MACRO_ARG |
| Воздействие: Низкий |