首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用现代C++取代宏

用现代C++取代宏
EN

Stack Overflow用户
提问于 2021-03-11 22:14:15
回答 1查看 292关注 0票数 2

我有以下宏

代码语言:javascript
复制
 #define Error(error_msg) ErrorMsg(__FILE__,__LINE__,error_msg)

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

我的函数ErrorMsg具有以下接口

代码语言:javascript
复制
void ErrorMsg(const std::string &file, int line, const std::string &report)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-12 01:46:18

正如@m88在评论中所说的,位置是获取文件名、函数名和行号的现代C++方式--实际上,它非常现代,只有真正支持C++20的新编译器才支持它。

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

代码语言:javascript
复制
#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;
}

它产生:

代码语言:javascript
复制
info: ./example.cpp:23: Hello World
info: ./example.cpp(23:62) `int main()` Hello World

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

这里有一个宏版本也可以打印函数名:

代码语言:javascript
复制
#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;
}

它产生:

代码语言:javascript
复制
info: ./example.cpp(27) `int main()` Hello World
info: ./example.cpp(27:62) `int main()` Hello World

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66591336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档