Я смотрю на какой-то код и думаю, что вся логика здесь не имеет смысла. Кажется довольно бедным, чтобы иметь такой макрос. В качестве примера я использую этот макрос дважды, и я получаю обе строки для вывода.Статические переменные внутри макросов
TESTING("hello");
TESTING("world");
Препроцессор просто заменяет идентификатор с блоком кода, это то же самое, как копировать/вставить код, поэтому не должен компилятор дать ошибку переопределения для FirstPass, при использовании этого макроса много раз? (Если вы вручную вставить в
main
,static bool firstPass = true;
несколько раз, компилятор выдаст сообщение об ошибке.)Если
firstPass
являетсяstatic
, он создается и инициализируется только один раз. Таким образом, использование этого макроса несколько раз не должно давать никаких результатов (кроме первого использования), поскольку флаг был установлен вfalse
, но он все равно делаетcout
каждый раз.
Немного смущенный.
#define TESTING(input) \
{ \
static bool firstPass = true; \
if (firstPass) { \
std::cout << input; \
firstPass = false; \
} \
}
Да, плохо использовать макросы вместо шаблонов функций. – LogicStuff
Этот код бессмыслен. Каждый раз, когда вы его вызываете, у вас будет новый 'firstPass' из-за правил определения области. – NathanOliver
Ваше недоразумение похоже на макросодержание (в частности, блок, '{...}'), а не сам макрос. То есть, если вы вручную копируете и вставляете содержимое макроса, как вы говорите, у вас есть такая же проблема без участия каких-либо макросов. – chris