宏作为函数参数的默认参数

时间:2010-08-16 12:45:32

标签: c++ function macros default arguments

我正在写logger文件。我更喜欢在那里使用宏 __ FUNCTION __ 。我不喜欢这样的方式:

Logger.write("Message", __FUNCTION__);

也许,有可能做出类似的事情:

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

如果没有,有没有办法做不到手的东西(我的意思是传递函数名称)?

3 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

您最终可以在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!"); 
}