Я хочу иметь возможность:

#define DEBUG_MODE 1

Для того чтобы включать и выключать вызовы функции printf() во всем моем коде. Я знаю, как это сделать, если все настроено так:

if (DEBUG_MODE) printf("Hello World\n");

Как бы то ни было, для этого необходимо предвидеть и выстраивать все построчно.

Существует ли или может быть создана функция поиска и замены в макросах, которая может заменить заданное выражение - например, printf(); - пустой строкой (или чем-либо еще, что вам может понадобиться)?

#define DEBUG_MODE replace("printf(some_regular_expression);", ""); // where "" is empty string 

Я уверен, что это невозможно, тем более с помощью regex, но спросить не помешает.

gcr

Ответов: 1

Ответы (1)

Хотя такого зверя можно сконструировать различными махинациями, я бы настоятельно не советовал этого делать. Этого нет в стандартном C, и ваша IDE возненавидит вас.

Типичный метод заключается в определении чего-то вроде debug_printf как printf (или, в последнее время, fprintf(stderr, ...)) или макроса, который расширяется до ничего.

Я рекомендую смириться с дополнительным уровнем косвенности и просто продолжать писать

#include 
#include 
void debug_printf(const char *fmt, ...)
{
#if !defined(DEBUG)
    if (loglevel < LOG_DEBUG) return;
#endif
    va_list ap;
    va_start(ap, &fmt);
    vfprintf(stderr, fmt, ap);
}

где loglevel - глобальная переменная, а LOG_DEBUG - макрос, и оба они определены вами. Идея заключается в том, что вы можете включить эти утверждения во время выполнения программы, передав ей параметр. Это часто бывает полезно, если в отладочную печать было вложено значительное количество работы.

Сделав это, вы можете использовать IDE search & replace один раз, чтобы обновить все вызывающие сайты, которым соответствовал ваш regex.

2022 WebDevInsider