Вы используете директиву препроцессора в аргументе к функциональному макросу
Этот дефект возникает, когда вы используете директиву препроцессора в аргументе к функциональному макросу или функции, которая может быть реализована как функциональный макрос.
Для образца, a #ifdef оператор возникает в аргументе к memcpy функция. The 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 (раздел 6.10.3), если список аргументов в сам функциональный макрос имеет директивы предварительной обработки, подстановка аргумента во время предварительной обработки не определена.
Чтобы убедиться, что подстановка аргумента происходит однозначно, используйте директивы препроцессора вне функционального макроса.
Например, чтобы выполнить memcpy с различными аргументами, основанными на #ifdef директива, вызов memcpy несколько раз в #ifdef директивные ветви.
#ifdef PLATFORM1
memcpy(dest, src, 12);
#else
memcpy(dest, src, 24);
#endif| Группа: Программирование |
| Язык: C | C++ |
| По умолчанию: On для рукописного кода, off для сгенерированного кода |
Синтаксис командной строки
: PRE_DIRECTIVE_MACRO_ARG |
| Влияние: Низкое |