Я немного неохотно публикую этот ответ, потому что использование макроса хакера может стать источником проблем. Однако - , если вызовы функции, которые вы хотите удалить, всегда используются отдельно в инструкции (т. Е. Они никогда не являются частью более крупного выражения), тогда может работать что-то вроде следующего (и обрабатывает varargs):
#ifdef SOMETHING
#define foo (1) ? ((void) 0) : (void)
#else
#define foo MyFunction
#endif
Так что если у вас есть строка кода:
foo("this is a %s - a++ is %d\n", "test", a++);
он будет в конечном итоге после стадии предварительной обработки либо как:
MyFunction("this is a %s - a++ is %d\n", "test", a++);
или
(1) ? ((void) 0) : (void)("this is a %s - a++ is %d\n", "test", a++);
который превращает список параметров в псевдо-функциях в кучу выражений, разделенных оператором запятая, которые никогда не будут оценены, так как условные всегда возвращает ((void) 0)
результата.
Вариантом это что-то близкое к тому, что предложил ChrisW и Джонатан Леффлера:
#ifdef SOMETHING
#define foo if (0) MyFunction
#else
#define foo if (1) MyFunction
#endif
Это немного отличается тем, что она не требует, чтобы компилятор поддерживает VARIADIC макросы (__VA_ARGS__
).
Я думаю, что это может быть полезно для устранения вызовов функции отладки трассировки, которые, как правило, никогда не объединяются в большее выражение, но помимо этого я считаю, что это опасная техника.
Обратите внимание на потенциальные проблемы - особенно если параметры вызова вызывают побочные эффекты (это общая проблема с макросами - не только этот хак). В этом примере a++
будет оцениваться только в том случае, если в сборке определено SOMETHING
, иначе это не так. Так что, если код после вызова зависит от значения a
, чтобы увеличить его, одна из сборок имеет ошибку.
Узнайте, поддерживает ли ваш компилятор «переменные макросы». – ChrisW
_Why_ вы хотите это сделать? Возможно, есть и другой способ получить то, что вам нужно. Потому что без контекста то, что вы хотите сделать, кажется довольно опасным ... – gimpf
Для компиляторов, которые не поддерживают переменные макросы, приятно удалять строки отладки и вызовы функций. Это экономит много исполняемого пространства. – MSN