У меня есть следующий фрагмент кода:
#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
?
Это должно быть тривиально, чтобы убедиться в этом самостоятельно, проверив полученный двоичный файл.
Я бы сказал «нет», поскольку выражение полностью исчезает, компилятор никогда не увидит строку (она удаляется расширением макроса препроцессора).
Поскольку препроцессор запускается перед компилятором, эта строка даже не будет существовать при запуске компилятора. Итак, ответ - нет, он вообще не использует память.
Нет, его не будет в двоичном формате. Он даже не будет скомпилирован - препроцессор расширит его до пустой строки до компиляции, поэтому компилятор даже не увидит его.
Нет. Препроцессор выполняется перед компиляцией, поэтому код никогда не будет виден. Однако я хотел бы добавить, что если вы заинтересованы в добавлении журналирования в свое приложение C ++, вы можете использовать библиотеку Log4Cxx . Он использует аналогичные макросы, которые вы можете полностью исключить из своего приложения, но когда ведение журнала включено, он поддерживает несколько разных уровней ведения журнала (в зависимости от важности / серьезности), а также несколько различных «приложений», на которые следует отправлять выходные данные журнала (например, syslog , консоль, файлы, сетевой ввод-вывод и т. д.).
Полную документацию по API можно найти в Log4Cxx API docs . Кроме того, если у вас есть разработчики Java, которые использовали Log4J , они должны чувствовать себя как дома с Log4Cxx (и убедить вас использовать его).