Условная компиляция C++

У меня есть следующий фрагмент кода:

#ifdef DO_LOG
#define log(p) record(p)
#else
#define log(p)
#endif

void record(char *data){
.....
.....
}

Теперь, если я звоню log("hello world") в моем коде и DO_LOG не определяется, строка будет скомпилирована, другими словами, она съест память для строки "привет мир"?

P.S. Существует много рекордных вызовов в программе, и это - чувствительная память, так есть ли любой другой способ условно скомпилировать так, чтобы это только зависело от #define DO_LOG?

5
задан Brian Tompsett - 汤莱恩 13 June 2016 в 10:58
поделиться

4 ответа

Это должно быть тривиально, чтобы убедиться в этом самостоятельно, проверив полученный двоичный файл.

Я бы сказал «нет», поскольку выражение полностью исчезает, компилятор никогда не увидит строку (она удаляется расширением макроса препроцессора).

14
ответ дан 18 December 2019 в 06:34
поделиться

Поскольку препроцессор запускается перед компилятором, эта строка даже не будет существовать при запуске компилятора. Итак, ответ - нет, он вообще не использует память.

4
ответ дан 18 December 2019 в 06:34
поделиться

Нет, его не будет в двоичном формате. Он даже не будет скомпилирован - препроцессор расширит его до пустой строки до компиляции, поэтому компилятор даже не увидит его.

4
ответ дан 18 December 2019 в 06:34
поделиться

Нет. Препроцессор выполняется перед компиляцией, поэтому код никогда не будет виден. Однако я хотел бы добавить, что если вы заинтересованы в добавлении журналирования в свое приложение C ++, вы можете использовать библиотеку Log4Cxx . Он использует аналогичные макросы, которые вы можете полностью исключить из своего приложения, но когда ведение журнала включено, он поддерживает несколько разных уровней ведения журнала (в зависимости от важности / серьезности), а также несколько различных «приложений», на которые следует отправлять выходные данные журнала (например, syslog , консоль, файлы, сетевой ввод-вывод и т. д.).

Полную документацию по API можно найти в Log4Cxx API docs . Кроме того, если у вас есть разработчики Java, которые использовали Log4J , они должны чувствовать себя как дома с Log4Cxx (и убедить вас использовать его).

2
ответ дан 18 December 2019 в 06:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: