我有以下代码段:
#ifdef DO_LOG
#define log(p) record(p)
#else
#define log(p)
#endif
void record(char *data){
.....
.....
}
现在,如果我在代码中调用log("hello world")
并且未定义DO_LOG
,那么该行是否会被编译,换句话说,它会占用字符串“hello world”的内存吗?
P.S。程序中有很多记录调用并且它对内存敏感,那么有没有其他方法可以有条件地编译,这样它只依赖于#define DO_LOG
?
答案 0 :(得分:14)
通过检查生成的二进制文件,这对于自己进行验证应该是微不足道的。
我会说“不”,因为表达式完全消失,编译器永远不会看到字符串(它被预处理器的宏扩展删除)。
答案 1 :(得分:4)
由于预处理器在编译器之前运行,因此编译器运行时该行甚至不存在。所以答案是否定的,它根本不使用任何内存。
答案 2 :(得分:4)
不,它不会在二进制文件中。它甚至不会被编译 - 预编译器会在编译之前将它扩展为空字符串,因此编译器甚至不会看到它。
答案 3 :(得分:2)
没有。预编译器在编译之前执行,因此甚至不会看到代码。但是,我想补充一点,如果您对将日志记录添加到C ++应用程序感兴趣,则可能需要使用Log4Cxx库。它使用类似的宏,您可以从应用程序中完全忽略它,但是当启用日志记录时,它支持几种不同级别的日志记录(基于重要性/严重性)以及发送日志记录输出的多个不同“appender”(例如syslog) ,控制台,文件,网络I / O等。)。
可以在Log4Cxx API docs找到完整的API文档。此外,如果您有任何使用Log4J的Java开发人员,他们应该感到宾至如归(并说服您使用它)。