有没有办法指示 C++ 编译器跳过当前文件的其余部分?

问题描述 投票:0回答:2

有时必须有条件地编译某些功能。例如,只有当

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++ 中可能有类似的事情吗?

c++ visual-c++ c-preprocessor
2个回答
8
投票

澄清这一点的一个简单方法是将实现放在包含的另一个文件中:

文件记录器.cpp:

#ifdef WITH_LOGGING
 #include <Logger.h>
 #include "logger.impl"
#endif

文件logger.impl:

// several hundred lines
// of class Logger
// implementation
// follows

0
投票

为什么要尝试排除该文件的内容?如果我理解正确的话,如果未设置定义,则不会使用其中的代码。在这种情况下,链接时优化应该从可执行文件中删除这些函数。

如果您有从其他库重写的函数,这将不起作用,但对于常规情况(最有可能用于日志记录),这就足够了。在 GCC 中,编译器为 --ffunction-sections,链接器为 --gc-sections。 Visual Studio 应该有类似的标志,但我不知道它们是什么。

© www.soinside.com 2019 - 2024. All rights reserved.