gpt4 book ai didi

c++ - 用现代 C++ 替换宏

转载 作者:行者123 更新时间:2023-12-04 02:27:17 26 4
gpt4 key购买 nike

我有以下宏

 #define Error(error_msg) ErrorMsg(__FILE__,__LINE__,error_msg)

我想知道是否可以用更现代的 C++ 来替换它,这些 C++ 可以在头文件中一劳永逸地定义?

我的函数ErrorMsg具有以下接口(interface)

void ErrorMsg(const std::string &file, int line, const std::string &report)

最佳答案

就像@m88在评论中所说,std::source_location是获取文件名、函数名和行号的现代 C++ 方法 - 事实上,它非常现代,以至于只有支持 C++20 的全新编译器才支持它。

这是一个同时执行宏方式和 std::source_location 方式的程序,以便您可以比较它们:

#include <iostream>
#include <source_location>

void ErrorMsg(const std::string &file, int line, const std::string &message)
{
std::cout << "info: " << file << ":" << line << ": " << message << "\n";
}

#define ErrorMacro(error_msg) ErrorMsg(__FILE__,__LINE__,error_msg)

void ErrorFunction(const std::string &message, const std::source_location& location = std::source_location::current())
{
std::cout << "info: "
<< location.file_name() << "("
<< location.line() << ":"
<< location.column() << ") `"
<< location.function_name() << "` "
<< message << '\n';
}

int main()
{
ErrorMacro("Hello World"); ErrorFunction("Hello World");

return 0;
}

它产生:

info: ./example.cpp:23: Hello World
info: ./example.cpp(23:62) `int main()` Hello World

尝试一下 https://godbolt.org/z/xdh4Y6

这是宏版本也可以打印函数名称的版本:

#include <iostream>
#include <source_location>

void ErrorMsg(const std::string &file, const std::string &function, int line, const std::string &message)
{
std::cout << "info: " << file << "(" << line << ") `" << function << "` " << message << "\n";
}

#ifdef _MSC_VER
#define ErrorMacro(error_msg) ErrorMsg(__FILE__,__FUNCSIG__,__LINE__,error_msg)
#else
#define ErrorMacro(error_msg) ErrorMsg(__FILE__,__PRETTY_FUNCTION__,__LINE__,error_msg)
#endif

void ErrorFunction(const std::string &message, const std::source_location& location = std::source_location::current())
{
std::cout << "info: "
<< location.file_name() << "("
<< location.line() << ":"
<< location.column() << ") `"
<< location.function_name() << "` "
<< message << '\n';
}

int main()
{
ErrorMacro("Hello World"); ErrorFunction("Hello World");

return 0;
}

它产生:

info: ./example.cpp(27) `int main()` Hello World
info: ./example.cpp(27:62) `int main()` Hello World

尝试一下 https://godbolt.org/z/13jKfz

关于c++ - 用现代 C++ 替换宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66591336/

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