【问题标题】:Macros as default param for function argument宏作为函数参数的默认参数
【发布时间】:2023-07-25 12:08:02
【问题描述】:

我正在编写记录器文件。我更喜欢在那里使用宏 __FUNCTION__。我不喜欢这样的方式:

Logger.write("Message", __FUNCTION__);

也许,有可能做这样的事情:

void write(const string &message, string functionName = __FUNCTION__)
{
   // ...
}

如果没有,有什么方法可以不用手动完成(我的意思是传递函数名)?

【问题讨论】:

    标签: c++ function macros default arguments


    【解决方案1】:

    你可以通过将它全部包装在一个宏中来做类似的事情:

    #define log(msg) Logger.write(msg, __FUNCTION__)
    

    缺点是使用此宏时,您需要将Logger 包含在范围内。

    【讨论】:

      【解决方案2】:

      你终于可以在 c++20 中不用宏魔法了:

      void write(std::string_view message, const std::source_location& location =
                                               std::source_location::current()) {
        std::cout << "Message= " << message
                  << ", Function=" << location.function_name();
      }
      
      int main() { 
        write("Hello world!"); 
      }
      

      【讨论】:

        【解决方案3】:

        宏仅通过文本替换工作 - 预处理器将宏定义放在其名称的位置。您不能拥有像您建议的那样的“智能”宏。

        在标准 C++ 中不支持您想要的内容。

        【讨论】:

        • 好的。感谢你的回答。会记住这一点的。