如何使用支持 __LINE__ 和 __FILE__ 的内联函数替换 C++ 异常宏?

2023-12-02

我目前正在阅读 Scott Meyers 的《Effective C++》一书。它说我应该更喜欢inline功能超过#define对于类似函数的宏。

现在我尝试编写一个内联函数来替换我的异常宏。我的旧宏看起来像这样:

#define __EXCEPTION(aMessage) \
{ \
    std::ostringstream stream; \
    stream << "EXCEPTION: " << aMessage << ", file " <<__FILE__ << " line " << __LINE__; \
    throw ExceptionImpl(stream.str()); \
}

我的新内联函数是这样的:

inline void __EXCEPTION(const std::string aMessage)
{
   std::ostringstream stream;
   stream << "EXCEPTION: " << aMessage << ", file " <<__FILE__ << " line " << __LINE__;
   throw ExceptionImpl(stream.str());
}

正如一些人可能已经预料到的那样,现在__FILE__ and __LINE__宏是无用的,因为它们总是引用带有内联函数定义的 C++ 文件。

有什么方法可以避免这种行为还是我应该坚持使用旧的宏?我在这里阅读了这篇文章,我已经怀疑我的第二个例子可能无法正常工作:

  • 内联函数中 __LINE__ 的行为
  • C++ 中的 __FILE__、__LINE__ 和 __FUNCTION__ 用法

不要使用__(双下划线)因为它是保留的。拥有一个inline功能比较好。
但是,这里您需要宏和函数的混合,因此您可以执行以下操作:

#define MY_EXCEPTION(aMessage) MyException(aMessage, __FILE__, __LINE__) 

inline void MyException(const std::string aMessage,
                        const char* fileName,
                        const std::size_t lineNumber)
{
   std::ostringstream stream;
   stream << "EXCEPTION: " << aMessage << ", file " << fileName << " line " << lineNumber;
   throw ExceptionImpl(stream.str());
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用支持 __LINE__ 和 __FILE__ 的内联函数替换 C++ 异常宏? 的相关文章

  • 这种双重实例是否有害,或者根本没有必要?

    在仔细阅读遗留资源时 我发现了这一点 DataSet myUPC new DataSet myUPC dbconn getDataSet dynSQL Resharper 正确地将其中的 new Dataset 部分 灰显 并建议 删除多余
  • 子进程中的变量修改

    我正在研究科比和奥哈拉伦的作品Computer Systems A Programmer s Perspective 练习 8 16 要求程序的输出如下 我更改了它 因为他们使用了一个你可以在他们的网站上下载的头文件 include
  • Visual Studio 2013 Intellisense 不会将枚举类型放在方法参数的位置

    例如 我有以下代码 namespace VS2013 EnumTypes class Program enum SomeEnum One Two static void SomeMethod SomeEnum someEnum some c
  • File.ReadAllLines 或流读取器

    我们可以使用以下方式读取文件StreamReader http msdn microsoft com en us library vstudio system io streamreader或通过使用File ReadAllLines ht
  • Python 宏:用例?

    如果 Python 有一个类似于 Lisp Scheme 的宏工具 比如元Python https code google com p metapython 你会如何使用它 如果您是一名 Lisp Scheme 程序员 您会使用宏来做什么
  • 更新 OSX 命令行工具 6.3 后缺少 C++ 标头 <__debug>

    从 App Store 更新到 Command Line Tools 6 3 后 程序包括
  • const_iterators 更快吗?

    我们的编码指南更喜欢const iterator 因为它们比正常的要快一点iterator 当您使用时 编译器似乎会优化代码const iterator 这真的正确吗 如果是的话 内部到底发生了什么使得const iterator快点 编辑
  • 泛型类上的 DebuggerDisplay

    我在应用时遇到问题DebuggerDisplay泛型类的属性 DebuggerDisplay foo class Foo DebuggerDisplay Bar t class Bar
  • C++ fill() 与 uninitialized_fill()

    您好 我是初学者 我想知道容器的 fill 和 uninitialized fill 之间的区别 我在谷歌上进行了快速搜索 但没有得到很好的答案 有人可以帮助我吗 fill 将值 使用赋值运算符 分配给已构造的对象 uninitialize
  • 谷歌基准迭代的意义是什么?

    我正在使用 Google Benchmark 来测量某些代码的执行时间 例如 我编写了以下代码来测量其执行时间性能 include
  • 如何修改 edmx 的默认代码生成策略?

    我想修改默认的代码生成策略 该怎么做 我只是想修改类名 lt code Escape container gt to Entities并将默认连接字符串更改为name Default 我不想为该项目创建模板文件 我想编辑它以便它可以在全球范
  • C++头文件问题

    我在处理类时尝试了一些 C 代码 这个问题出现在我身上 并且让我有点烦恼 我创建了一个包含类定义的头文件和一个包含实现的 cpp 文件 如果我在不同的 cpp 文件中使用此类 为什么要包含头文件而不是包含类实现的 cpp 文件 如果我包含类
  • 通过 MVC 将数据写入数据库的最佳方法是什么?

    我正在使用 MVC 和 EF Core 开发一个家庭作业项目 我正在寻找将数据写入数据库的最佳方法 我是初学者 有两张桌子 Predbilje ba 报名 和Seminari 研讨会 public class Predbilje ba Ke
  • 将数组显式衰减为指针

    最简洁 最惯用的方式是什么明确地将数组衰减为指针 例如 考虑您需要能够指导 SFINAE 或明确过载的情况 template
  • Roslyn,通过 hostObject 传递值

    我正在尝试通过 hostObject 发送一个类 但显然它不想工作 using Roslyn Compilers using Roslyn Compilers CSharp using Roslyn Scripting using Rosl
  • 我们可以使用 C# 录制发送到扬声器的声音吗

    我有一个软件 SoundTap Streaming Audio Recorder 它记录发送到扬声器的任何音频 无论流是来自网络还是来自某些文件或麦克风 我可以在桌面应用程序中制作这样的应用程序 以便我可以录制发送到扬声器的流 无论来源如何
  • 在 C++17 中编译具有非固定基础类型的 constexpr 从 int 静态转换为作用域枚举的未定义行为

    我想知道以下内容是否应该在 C 17 中编译 enum class E A B constexpr E x static cast
  • int 类型的构造函数

    考虑到成本 这些情况是否相同 case 1 int a 5 case 2 int a 5 case 3 int a a 5 这三种语法是不同的 请耐心等待 我使用用户定义类型而不是 int 稍后我将回到 int T a 5 Direct i
  • 定义一个断言,即使定义了 NDEBUG,该断言也有效

    我想定义一个assert与标准相同的宏assert 3 http man7 org linux man pages man3 assert 3 html调用 但它不会被预处理器删除NDEBUG被定义为 这样的呼唤 让我们称之为assert2
  • 恐怖分子已弃用

    正在接听另一个问题 https stackoverflow com q 11830514 1468366 我偶然发现了man page http linux die net man 3 herror一个名为的函数herror 看起来很像pe

随机推荐

  • 如何在 TFS 2017 中删除团队项目集合

    我在 TFS 2017 中有一个未使用的团队项目集合 它是在我们公司刚推出 TFS 作为测试时创建的 所以从来没有真正的代码签入或任何东西 所以我想直接删除 我不知道这是如何运作的 删除集合 分离集合 删除集合数据库 删除支持删除的 Sha
  • Java:闪烁窗口以吸引用户注意力

    在 Java 中是否有比这更好的方法来刷新窗口 public static void flashWindow JFrame frame throws InterruptedException int sleepTime 50 frame s
  • Pandas 中的转换与聚合

    对 Pandas DataFrame 进行分组时 我应该何时使用transform我什么时候应该使用aggregate 怎么办 它们在实践中的应用有所不同 您选择哪一种 考虑更重要 考虑数据框df df pd DataFrame dict
  • ARM 编译错误,VFP 寄存器由可执行文件使用,而不是目标文件

    过去几天我一直遇到这个问题 我无法弄清楚这里到底发生了什么 或者问题是什么 我有一个带有这些标志的 makefile CC arm linux gnueabihf gcc 4 6 FLAGS O3 march armv7 a mtune c
  • FunctionK 类型参数的界限

    我在用着cats 自由单子 这是代数的简化版本 sealed trait Op A object Op final case class Get T name String extends Op T type OpF A Free Op A
  • Excel VBA 从多个 SharePoint 文件夹上传/下载

    我在 Internet 上找到了使用 VBA 从 SharePoint 文件夹下载文件的示例代码 在资源管理器中打开 映射到驱动器号等 因此 我编写了以下代码 Dim sharepointFolder As String Dim colDi
  • 列表视图中以0x8007000为前缀的计划任务返回码,在事件日志中注册为0

    我目前正在尝试在 Zabbix 中设置对 Windows 计划任务的监控 只需监视通过 201 事件过滤的 Microsoft Windows TaskScheduler Operational 事件日志并在返回代码上进行正则化似乎很容易
  • Python:带参数的多处理函数[重复]

    这个问题在这里已经有答案了 我有一些 python 函数可以从远程主机读取文件并处理其内容 我已将所有这些函数放在一个 python 文件中来运行 但问题是每个函数直到前一个函数完成其工作后才开始运行 这会花费不必要的时间 我考虑过并行运行
  • SDK Manager.exe 不起作用

    当我单击 Program Files 上的 SDK Manager 或在中运行它时cmd 什么都没发生 我做了 安装了最新的JDK 安装最新的Android SDK 设置环境JAVA HOME并将 JAVA HOME bin放入路径变量 实
  • 无法解析类型“JNICALL”,?

    我正在尝试在 Eclipse 中使用 NDK 但是当遵循教程时 会弹出此错误 我不明白它来自哪里 这是我的 h 文件 DO NOT EDIT THIS FILE it is machine generated include
  • 为什么非成员函数不能用于重载赋值运算符?

    赋值运算符可以使用成员函数重载 但不能使用非成员函数重载friend功能 class Test int a public Test int x a x friend Test operator Test obj1 Test obj2 Tes
  • 使用 Kafka 主题后发送 HTTP 响应

    我目前正在编写一个包含大量微服务的 Web 应用程序 我目前正在探索如何在所有这些服务之间正确通信 并且我决定坚持使用消息总线 或更具体地说是 Apache Kafka 然而 我有一些问题 我不确定如何从概念上解决 我使用 API 网关服务
  • 将字符串拆分为数组而不删除分隔符?

    我有一个像这样的字符串 asdf a b c2 我想将它分成一个数组 如下所示 asdf a b c2 Using string split 删除空格 结果是 asdf a b c2 我想到插入额外的分隔符 例如 string replac
  • Python GraphQL API 调用组合

    我最近开始学习如何使用 python 但在 graphQL api 调用方面遇到了一些问题 我正在尝试设置一个循环来使用分页获取所有信息 并且我的第一个请求工作得很好 values query organizations ids pipes
  • 使用 Motorola Moto G(或 Moto X)录制立体声音频

    我希望有人能帮助我解决这个问题 不久前 我开发了一个应用程序 以便同时录制智能手机中前置麦克风和后置麦克风捕获的声音 基本上 我像这样制作下一个对象 音频记录 音频记录 新音频记录 MediaRecorder AudioSource CAM
  • RawPy 对象中的颜色矩阵是什么?

    我正在读取尺寸为 3120 x 4208 的 DNG 图像RawPy dng rawpy imread TestImages IMG 20200108 161323 dng 调试的时候看到dng有一个名为color matrix 形状为 3
  • swift - if 语句和数组

    我想将 DicX 中的字符串与现有标题 根据单元格选择而变化的表格标题 进行匹配 var DicX xx yy zz qq let DicYY 11 22 33 44 1 2 3 4 m n k b bb kk mm nn 我正在比较的标题
  • 从可能未格式化为表格的网页中提取数据

    首先 我绝不是 VBA 专家 只要知道得足够多就会很危险 8 我首先搜索了如何从网页中提取表格 发现很多人都问了同样的问题 不幸的是 我读到的大部分内容都超出了我的理解范围 我读过的一篇文章向我指出了这一点详细文章作者 Siddharth
  • asp.net MVC 有应用程序变量吗?

    我正忙于将 Web 应用程序转换为 MVC 并将一些信息保存到跨多个租户 帐户使用的应用程序变量中 以提高效率 我意识到 MVC 的要点是尽可能保持无状态 会话状态显然在 MVC 中具有并存在是有意义的 但我们不想只将应用程序转换为会话变量
  • 如何使用支持 __LINE__ 和 __FILE__ 的内联函数替换 C++ 异常宏?

    我目前正在阅读 Scott Meyers 的 Effective C 一书 它说我应该更喜欢inline功能超过 define对于类似函数的宏 现在我尝试编写一个内联函数来替换我的异常宏 我的旧宏看起来像这样 define EXCEPTIO