Вы используете директиву препроцессора в аргументе к функциональному макросу
Этот дефект возникает, когда вы используете директиву препроцессора в аргументе к функциональному макросу или функции, которая может быть реализована как функциональный макрос.
Для образца, 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 |
Влияние: Низкое |