在 C++ 中传递变量“名称”

2024-02-20

我目前仅使用以下模板作为检查 NULL 指针的方法,如果为 NULL,则将错误消息打印到日志文件,然后返回 false。

template< typename T >
static bool isnull(T * t, std::string name = "")
{
    _ASSERTE( t != 0 );
    if( !t )
    {
        if( !(name.length()) ) name = "pointer";
        PANTHEIOS_TRACE_ERROR(name + " is NULL");
        return false;
    }
    return true;
}

我目前这样称呼它:

if( !(isnull(dim, BOOST_STRINGIZE(dim))) ) return false;

如果您注意到我需要传入要打印到日志文件的指针变量的“名称”,作为第二个参数。我目前正在使用 BOOST_STRINGIZE,它只需将括号内的任何文本转换为字符串。

以下是我的模板实现的缺点(至少对于我的使用而言)

  • 任何人都可以将任何内容作为参数传递给 BOOST_STRINGIZE 以在日志文件中打印出来 - 因为这两个参数无论如何都不相关 - 所以我不一定会看到实际上为 NULL 的“变量名称”
  • 我们一定要记得传入第二个参数,否则没用。

无论如何,我是否可以自动确定第一个变量的“名称”,以便我可以在每次调用时省略将其作为第二个参数传递?


您可以将所有内容放在一个宏中:

#define IS_NULL(name_) isnull(name_, #name_)

注意BOOST_STRINGIZE如果它是一个宏,则扩展它的参数,这可能是也可能不是您想要的:

#define X(x_) std::cout << BOOST_STRINGIZE(x_) << " = " << x_ << std::endl;
X(NULL); // prints: "0 = 0"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C++ 中传递变量“名称” 的相关文章

  • 与 MinGW 的静态和动态/共享链接

    我想从一个简单的链接用法开始来解释我的问题 假设有一个图书馆z它可以编译为共享库 libz dll D libs z shared libz dll 或静态库 libz a D libs z static libz a 让我想要链接它 然后
  • copy_from_user() 错误:目标大小太小

    我正在为内核模块编写 ioctl 处理程序 我想从用户空间复制数据 当我编译禁用优化的代码时 O0 gflags 编译器返回以下错误 include linux thread info h 136 17 error call to bad
  • 使用管道在父级和子级之间传递整数值

    我对如何正确使用 pipeline 在两个进程之间传递整数值有点困惑 在我的程序中 我首先创建一个管道 然后分叉它 我假设我有 两个 管道 据我了解 这是我的任务 我的父母通过 for 循环检查某个操作的整数值 i 增加计数变量 并将值保存
  • 并行运行多个任务

    我有一个代理列表 每个代理都会访问不同的站点并从站点中提取所需的数据 目前它一次只做一个 但我希望同时运行 10 20 个任务 这样它就可以一次性从 20 个站点下载 而不是只下载一个 这是我目前正在做的事情 private async T
  • 无法在 CUDA 中找到 1 到 100 数字的简单和?

    我正在研究使用 CUDA 的图像处理算法 在我的算法中 我想使用 CUDA 内核找到图像所有像素的总和 所以我在cuda中制作了内核方法 来测量16位灰度图像的所有像素的总和 但我得到了错误的答案 所以我在cuda中编写了一个简单的程序来查
  • 来自 double 的 static_cast 可以优化分配给 double 吗?

    我偶然发现了一个我认为不必要的功能 并且通常让我感到害怕 float coerceToFloat double x volatile float y static cast
  • 如何从经过身份验证的 SecurityToken 中获取声明

    我将令牌作为字符串传递到 SOAP 服务中 并验证了该令牌是否有效 我现在有一个 SecurityToken 在调试模式下我可以看到所有声明 特别是我想传递到另一个方法的 userId 声明 我似乎不知道如何获得这些索赔 现在 我解码了令牌
  • 如何在 C++ 中为指针“this”赋值

    在函数中 如何分配this一个新的价值 您可以分配对象this点于 this XY 但你不能分配直接值this this XY Error Expression is not assignable
  • 获取列表框中视图中的项目

    我有一个 ListBox 其属性 VirtualizingStackPanel VirtualizationMode 设置为 回收 我正在绑定一个自定义集合 实现IList and IList
  • 如何在 C# 中以编程方式将行添加到 DataGrid?

    正如标题所述 我正在尝试使用 C 以编程方式将行添加到 DataGrid 但我似乎无法使其工作 这是我到目前为止所拥有的 I have a DataGrid declared as dg in the XAML foreach string
  • 公交车公共交通算法

    我正在开发一个可以查找公交路线的离线 C 应用程序 我可以提取时间表 巴士 路线数据 我正在寻找适用于基本数据的最简单的解决方案 可以使用什么算法来查找从巴士站 A 到巴士站 B 的路线 是否有适用于 C Java 的开源解决方案 数据库的
  • 大量互斥体对性能的影响

    假设我有一个包含 1 000 000 个元素的数组 以及多个工作线程 每个线程都操作该数组中的数据 工作线程可能会使用新数据更新已填充的元素 但每个操作仅限于单个数组元素 并且独立于任何其他元素的值 使用单个互斥锁来保护整个数组显然会导致高
  • 注入包含接口的所有已注册实现的 Enumerable

    给出以下接口 public interface IMyProcessor void Process 我希望能够注册多个实现 并让我的 DI 容器将它们的可枚举注入到这样的类中 public class MyProcessorLibrary
  • 更改私有模块片段是否会导致模块重新编译?

    On 此页面有关 C 20 模块功能 https www modernescpp com index php c 20 modules private module fragment and header units 我发现了这样的说法 借
  • 为什么连续抛出 2 个异常不会生成无法访问的代码警告?

    为什么以下代码行不会创建编译器警告 void Main throw new Exception throw new Exception 据我所知 编译器应该通知您无法到达第二个抛出异常 这显然是一个编译器错误 它是在 C 3 0 中引入的
  • C# 可以为控制台应用程序部分类“程序”类吗?

    我想知道是否可以将为任何控制台应用程序创建的默认 程序 类更改为部分类 我想这样做是因为我想要更好的组织 而不是将所有方法都放在按区域分类的 1 个文件中 对我来说 将某些方法类别放在单独的文件中会更有意义 我对分部类的理解是 它是多个文件
  • main.cpp 是必需的吗?

    我试图编译一个程序cmake 我最终删除了我的main cpp文件 我刚刚将其复合到另一个包含我的项目名称的文件中 即 我刚刚将主函数剪切并粘贴到该文件中 问题是我有一个main cpp未发现错误 不确定是否在C 一个名为main cpp是
  • 让 Windows 尝试读取文件

    我正在对 Windows 文件系统进行某种封装 当用户请求打开文件时 Windows 调用我的驱动程序来提供数据 在正常操作中 驱动程序返回缓存的文件内容 但是 在某些情况下 实际文件没有缓存 我需要从网络下载它 问题是是否有可能让 Win
  • 查找数组中的多个索引

    假设我有一个像这样的数组 string fruits watermelon apple apple kiwi pear banana 是否有一个内置函数可以让我查询 apple 的所有索引 例如 fruits FindAllIndex ap
  • 异步/等待 - 是*并发*吗?

    我一直在考虑 C 5 中新的异步内容 并且出现了一个特殊问题 据我了解 await关键字是一个简洁的编译器技巧 语法糖来实现连续传递 http en wikipedia org wiki Continuation passing style

随机推荐

  • 故意依赖 Linq Side Effects 是不好的做法吗?

    像这样的编程模式经常出现 int staleCount 0 fileUpdatesGridView DataSource MultiMerger TargetIds Select id gt FileDatabaseMerger merge
  • 使用 listpreference 并获取密钥有效,但没有“确定”按钮

    我在我的 android 应用程序中使用 listpreference 并获取我的键值 一切都很好并且工作正常 现在你们已经帮助了我 但是 当我的 listpreference 菜单弹出时 它们只包含一个取消按钮 假设用户正在红色 蓝色和绿
  • 在文本文件中附加新行的最佳变体是什么?

    我使用此代码将新行附加到文件末尾 let text New line to string let mut option OpenOptions new option read true option write true option cr
  • JTable 单元格中有两行或多行?

    如何将两行或多行放入一个 JTable 单元格中 我尝试在行尾添加 n 但它不起作用 尝试这样的 HTML lineOne br lineTwo
  • 关于 OpenGL 不变限定符的困惑

    我在翻阅橙皮书 第 3 版 时 在第 9 章中发现了一段关于不变限定符的段落 它说 The 不变的限定符指示编译器并链接到忽略与输出计算不直接相关的表达式和函数 这段话出现在两个类似的代码片段之后 uniform mat4 MVPmatri
  • 如何每 x 秒调用一个函数并更新状态(React)

    我在这方面遇到了很多麻烦 我尝试了各种方法 我想在单击开始按钮后每秒调用一个函数 然后在单击停止按钮后暂停它 我不断出现我无法解释的奇怪行为 我怎样才能在没有课程的情况下做出反应 我有 triid 的东西 const simulation
  • 是否可以使用 System.IO.Packaging.Package 压缩文件夹并稍后向其中添加文件/文件夹?

    我想知道我们是否可以使用 net 类 ZipPackage http msdn microsoft com en us library system io packaging zippackage aspx将文件夹压缩到file zip文件
  • QTableView - 限制所选项目的数量?

    问题就在标题里 没有函数 QTableView set Max Number SelectedItems int 当所选项目的数量为 2 时 我想禁用项目选择 Thanks 您可以通过以下方式禁用选择 connect ui gt table
  • 如何在碰撞后实现超时/冷却

    我一直在做一个pygame两名玩家尝试将球击入网中的游戏 我的游戏中有一个增强功能 但是 我想要一些增强垫 当它们被收集时 我会获得 3 增强 在我下面的代码中 有一个巨大的黄色物体 当有人将鼠标悬停在它上面时 他们会得到提升 但他们可以永
  • 从 URL 安装 conda 包

    在康达 有没有办法直接从 URL 安装包 如下所示 conda install url https anaconda org conda forge pytest 3 4 0 download linux 64 pytest 3 4 0 p
  • 如何让日期时间对象感知(而不是幼稚)

    我需要做什么 我有一个不了解时区的日期时间对象 我需要向其中添加一个时区 以便能够将其与其他时区感知的日期时间对象进行比较 我不想在不知道这一遗留情况的情况下将整个应用程序转换为时区 我尝试过的 首先 演示一下问题 Python 2 6 1
  • Liquibase 无法启动,因为在“迁移文件:类路径”中找不到更改日志

    当我启动应用程序时 它失败并显示以下消息 指出更改日志文件的类路径不存在 Description Liquibase failed to start because no changelog could be found at Migrat
  • 获取今天的 NSDate,时间为 00:00:00

    我正在 Xcode 中编写一个类别 它将扩展当前的 NSDate 类 我想添加两种我经常使用的方法 但不知何故我无法让它们正常工作 目前我有这个代码 NSDate today NSCalendar gregorian NSCalendar
  • Spring Boot中如何设置嵌入式tomcat的日志级别?

    Spring Boot中如何设置嵌入式tomcat的日志级别 特别是我需要查看tomcat集群相关的日志 我将以下行添加到 application properties 中 但 tomcat 似乎只记录 INFO 级别日志 logging
  • Flutter调试release模式,release模式下启用日志

    根据文档我知道 调试信息被删除 调试已禁用 但是我们可以以某种方式强制打印日志 或者在发布模式下进行调试吗 生产应用程序 我正在使用 Android Studio 例如 在 AS 中开发 Android 应用程序时 我们可以打印日志 and
  • PHP lambda 函数和范围

    下面的函数接受一个数组并检查其键和值是否与指定的数据类型匹配 我似乎对之前工作的内部 lambda 函数遇到了一些问题 我正在运行 PHP v5 3 6 他们最后在 v5 3 4 下工作 他们抱怨未传递的变量不在范围内 如果我将该变量重述为
  • 如何使用 uiview 和 uibutton 检测对 Uitableview 单元格的点击?

    我创建了一个表视图 并将自定义 uiview 添加到单元格的内容视图中 uiview 有一个 uibutton 但是 我可以在创建单元格时将 uibutton 添加到内容视图中 我想获取桌面视图上的点击事件来执行某些操作 我还希望 uibu
  • 如何映射或嵌套 Python 2.7 函数生成器?

    如果我在 Python 2 7 中有一个非常简单 尽管可能非常复杂 的函数生成器 如下所示 def accumulator x yield 0 while True x yield x 可以这样使用 gt gt gt a accumulat
  • 如何在firebird sql语句中使用非ascii字符串文字?

    我想在 firebird sql 查询中使用非 ascii 字符串文字 所以我用了火焰知更鸟首先看看它是否有效 我用过这样的东西 SELECT NAME FROM TABLE1 WHERE NAME 我也尝试过 SELECT NAME FR
  • 在 C++ 中传递变量“名称”

    我目前仅使用以下模板作为检查 NULL 指针的方法 如果为 NULL 则将错误消息打印到日志文件 然后返回 false template lt typename T gt static bool isnull T t std string