有时必须有条件地编译某些功能。例如,只有当
class Logger
宏为 WITH_LOGGING
d:时才使用
#define
// Logger.cpp
#ifdef WITH_LOGGING
#include <Logger.h>
// several hundred lines
// of class Logger
// implementation
// follows
#endif
这不是很方便 - 除非读者滚动浏览文件,否则他无法确定匹配的
#endif
位于文件末尾,因此整个文件内容都被 #ifdef
排除在外。我更喜欢这样的东西:
// Logger.cpp
#ifndef WITH_LOGGING
#GetOutOfThisFile
#endif
#include <Logger.h>
// several hundred lines
// of class Logger
// implementation
// follows
因此很明显,一旦
WITH_LOGGING
不是 #define
,编译器就会跳过文件的其余部分。
C++ 中可能有类似的事情吗?
澄清这一点的一个简单方法是将实现放在包含的另一个文件中:
文件记录器.cpp:
#ifdef WITH_LOGGING
#include <Logger.h>
#include "logger.impl"
#endif
文件logger.impl:
// several hundred lines
// of class Logger
// implementation
// follows
为什么要尝试排除该文件的内容?如果我理解正确的话,如果未设置定义,则不会使用其中的代码。在这种情况下,链接时优化应该从可执行文件中删除这些函数。
如果您有从其他库重写的函数,这将不起作用,但对于常规情况(最有可能用于日志记录),这就足够了。在 GCC 中,编译器为 --ffunction-sections,链接器为 --gc-sections。 Visual Studio 应该有类似的标志,但我不知道它们是什么。