c++ - 使用预处理器 C++ 定义常见错误消息
问题描述
假设我有多个地方调用 function int foo(x, y)
。根据返回码,我决定是否打印错误消息。所以代码看起来类似于:
void func1()
{
...
if(foo(x,y))
std::cerr << "Error occurred with values" << x << "," << y << __LINE__;
...
}
void func2()
{
...
if(foo(x,y))
std::cerr << "Error occurred with values" << x << "," << y << __LINE__;
...
}
我遇到的问题"Error occurred"
是在很多地方都在重复,而且到处都是一样的。#define
我想知道使用和重用它们定义常见错误消息是否是一种好习惯。所以代码会是这样的:
#define errMsg(x,y) \
std::string("Error occurred with values " + to_string(x) + "," + to_string(y) + to_string(__LINE__))
void func1()
{
...
if(foo(x,y))
std::cerr << errMsg;
...
}
void func2()
{
...
if(foo(x,y))
std::cerr << errMsg;
...
}
解决方案
显而易见的事情就是将错误消息放入其中foo
。如果你不能这样做,那就把它包装起来:
bool fooWithLogging(int x, iny y)
{
auto result = foo(x,y);
if (result)
{
std::cerr << "Error occurred with values" << x << "," << y << std::endl;
}
}
在代码中调用包装器:
void func1()
{
...
fooWithLogging(x,y);
...
}
void func2()
{
...
fooWithLogging(x,y);
...
}
奖励:使日志记录动态:
#ifdef DEBUG
bool g_isFooLoggingEnabled = true;
#else
bool g_isFooLoggingEnabled = false;
#endif
bool fooWithLogging(int x, iny y)
{
auto result = foo(x,y);
if (result && g_isFooLoggingEnabled)
{
std::cerr << "Error occurred with values" << x << "," << y << std::endl;
}
}
现在有了评论中提到的 FILE 和 LINE 要求:
bool _fooWithLogging(int x, iny y, const std::string& filename, int line)
{
auto result = foo(x,y);
if (result && g_isFooLoggingEnabled)
{
std::cerr << "Error occurred in file" << filename << " on line " << line << " with values" << x << "," << y << std::endl;
}
}
#define FooWithLogging(x, y) _fooWithLogging(x, y, __FILE__, __LINE__)
然后在代码中:
void func1()
{
...
FooWithLogging(x,y);
...
}
推荐阅读
- r - 使用 rtweet 包下载推文似乎停止在 8%。为什么?
- react-native - ENOENT:nosuch 文件或目录,scandir C:\Users\user\App\node_modules 每当尝试运行 yarn start
- openapi - 如何使用 Open API 描述计数受限、CSV 序列化的多选字段?
- c++ - 如何将 JSON 数据发送到 REST API?
- linux - 在perl中过滤具有给定输入范围的文件
- c# - 我们真的需要 C#.NET 项目中的 ApplicationInsights.config 文件吗?
- aurelia - 在 Aurelia 中的输入 html 元素上创建自定义属性
- python - 如何根据列的相等部分将图块分配给熊猫数据框?
- apache-spark - 如何指定;作为 csv 文件读取中 spark 中的字段分隔符
- python - 如何根据项目中的数字拆分列表项