gpt4 book ai didi

c++ - 预处理器,未定义时将宏展开为空

转载 作者:行者123 更新时间:2023-11-27 23:46:52 25 4
gpt4 key购买 nike

预处理器对我来说一直是黑魔法,但我想我终于需要使用它了。

我已经实现了一个记录器类,如果未设置标志,我想有条件地(编译标志)扩展为空,这样我就不会在生产中获得所有打印件。

这会有一个像这样的用例

FO_LOG << name() << "Hello World"  << std::endl;

我以为我可以这样定义它

#ifdef TRACE
#define FO_LOG {return Faceoff::trace::log();}
#else
#define FO_LOG \
if(false){\
return Faceoff::trace::log();\
}
#endif

但这不会编译并出现以下错误

no viable conversion from returned value of type 'Faceoff::trace' to function return type 'int'
FO_LOG << name() << "omitted" << std::endl;
^~~~~~
/omitted/include/globals.h:69:16: note: expanded from macro 'FO_LOG'
return Faceoff::trace::log();\
^~~~~~~~~~~~~~~~~~~~~

现在错误很清楚了,但是我不知道如何用预处理器语法表达我的意图...

最佳答案

给你:

class devnull : public std::ostream {
class devnullbuff : public std::streambuf {
public:
int overflow( int c ) { return c; }
} m_nb;
public:
devnull() : std::ostream( &m_nb ) {}
};
#ifdef TRACE
#define FO_LOG Faceoff::trace::log()
#else
#define FO_LOG devnull()
#endif

假设 Faceoff::trace::log() 返回某种类型的 ostream,那么你可以做你想做的:

FO_LOG << name() << "Hello World"  << std::endl;

这不是很有效,因为它每次都会创建一个新的 devnull 对象。您可以在您的程序中只创建一次并转发声明以避免这种情况。虽然它不是那么优雅。

关于c++ - 预处理器,未定义时将宏展开为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49836176/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com