gpt4 book ai didi

c++ - 使用宏为 C++ 类方法生成空代码

转载 作者:行者123 更新时间:2023-12-03 22:56:38 26 4
gpt4 key购买 nike

假设我有一个如下所示的类(class):

#define LOGGER_CLASS_ENABLED

#ifdef LOGGER_CLASS_ENABLED

class Logger{
public:
void println(const String&);
};

Logger this_is_a_singleton_logger;

#define MY_LOGGER this_is_a_singleton_logger

#endif
在我的代码中,每当我想记录一些东西时,我都会使用以下快捷方式:
MY_LOGGER.println("Hello") 
现在,假设我想禁用 Logger类(class)。在这种情况下,我不希望生成任何日志记录代码。因此,通常的“C 风格”方法是这样的:
#ifdef LOGGER_CLASS_ENABLED  
MY_LOGGER.println("Hello");
#endif
并在每次通话时重复此操作。
然而,由于有数百个这样的调用,在每个打印函数周围多加两行代码会使代码难以阅读。我该怎么做才能不到处添加两行,只保留一行 MY_LOGGER.println("Hello") ,但让宏用空行替换它。是否可以?
我尝试了以下但它给了我一个错误:
#ifndef LOGGER_CLASS_ENABLED

#define MY_LOGGER.println(x) // replace it with emtpiness

#endif

最佳答案

而有一个宏“LOG

#if defined(LOGGER_CLASS_ENABLED)
#define LOG(msg) MY_LOGGER.println(msg)
#else
#define LOG(msg) do {} while(false)
#endif
将允许完全禁用日志记录(因此 msg 不被评估,所以 LOG 参数不应该有副作用)。
保持使用 MY_LOGGER.println(x)并且“什么都不做”(尽管它仍然评估 x,但有副作用)
您可以创建一个 null object :
#ifdef LOGGER_CLASS_ENABLED

class RealLogger
{
public:
void println(const String& msg) { /*Real logging*/}
};

using Logger = RealLogger;

#else // !LOGGER_CLASS_ENABLED

class NullLogger
{
public:
void println(const String&) { /*empty*/ }
};

using Logger = NullLogger;

#endif

Logger this_is_a_singleton_logger;
#define MY_LOGGER this_is_a_singleton_logger

关于c++ - 使用宏为 C++ 类方法生成空代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66421947/

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