实现安全 nullptr

2023-11-24

我想让我的代码在旧版 C++(使用“NULL”的 C++ 代码)和新的 C++11 标准(使用“nullptr”的 C++ 代码)上都可编译

我正在使用 GCC,但计划在完成最重要的事情时也为 VS 重新编译整个代码库。

我是否应该期望 GCC 和 VS 都会做类似的事情

#define NULL nullptr

或者我自己做更好(当然使用不同的名称,其中 MY_LIB 将被我的库后缀替换)?

#ifndef nullptr
    #define MY_LIB_NULL NULL
#else
    #define MY_LIB_NULL nullptr
#endif

我想要实现的是无论 C++11 功能是否已实现都可以编译的代码(并且由于我没有使用模板,因此模板很少)。

例如,关键字“override”和“final”已经完成。

MY_LIB_OVERRIDE //macro, defines to "override" if c++11 is present.
MY_LIB_FINAL    //macro, defines to "final" if c++11 is present.

我问这个问题是因为我知道“nullptr”问题有点奇怪,所以也许只是像我已经为 override 和 Final 所做的那样,是错误的。需要对此的意见。欢迎任何帮助。


你可能会创建一个“假”my_nullptr类型的my_nullptr_t通过以下方式:

const class my_nullptr_t
{
    public:

        /* Return 0 for any class pointer */
        template<typename T>
        operator T*() const
        {
            return 0;
        }

        /* Return 0 for any member pointer */
        template<typename T, typename U>
        operator T U::*() const
        {
            return 0;
        }

        /* Safe boolean conversion */
        operator void*() const
        {
            return 0;
        }

    private:

        /* Not allowed to get the address */
        void operator&() const;

} my_nullptr = {};

这适用于 C++03 和 C++11,并且无论实现哪种 C++11 功能,都应该始终是安全的。该解决方案实际上已经在这个话题提出了一个版本nullptr_t基于官方提案.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实现安全 nullptr 的相关文章

随机推荐

  • 沙箱 JSR-223

    我正在尝试对 JSR 223 进行沙箱处理 具体来说 我不希望任何脚本访问我的任何类 我听说 Rhino 可以使用 ClassShutter 做到这一点 但我想一般地做到这一点 即对于 JSR 223 的所有脚本引擎 我首先尝试使用Acce
  • AngularJS + jQuery Mobile,无适配器和禁用路由 - 仅用于 UI 样式

    我正在学习 AngularJS 并构建了一个小型应用程序 现在它的功能已经完成 我想使用 jQuery Mobile 对其进行设计 本来我是掉进去的tigbro 的 jquery mobile angular adapter 但最终认为它比
  • 用公式作为变量运行小鼠:即时评估而不是稍后评估?

    The R包裹mice附带以下示例 library mice imp lt mice nhanes fit lt with data imp exp lm bmi hyp chl 我想要一个灵活的调用with like model form
  • 如何在Python中进行二分法

    我想制作一个 Python 程序 它将运行二分法来确定以下各项的根 f x 26 85x 91x2 44x3 8x4 x5 二分法是一种用于估计多项式 f x 根的数值方法 是否有任何可用的伪代码 算法或库可以用来告诉我答案 基本技术 下面
  • 如何从 Firefox 扩展执行页面定义的 JavaScript 函数?

    我正在创建一个 Firefox 扩展用于演示目的 我从扩展调用文档中的特定 JavaScript 函数 我在 HTML 文档中写了这个 不是在扩展内 而是由 Firefox 加载的页面 document funcToBeCalled fun
  • 是否有解决未定义的引用/未解决的符号问题的通用准则?

    我在工作中遇到了几个 未定义的引用 在链接期间 和 未解析的符号 在 dlopen 之后的运行时期间 问题 这是一个相当大的 makefile 系统 是否有链接库和使用编译器标志 选项来避免这些类型的错误的通用规则和指南 如果您使用的是 M
  • iPhone项目中如何准确找到内存泄漏的地方

    在 Xcode 中开发应用程序时 会发生内存泄漏 当我在扩展详细视图中检查它们时 它们显示了与实现无关的不同方法 如何准确找出哪个对象正在泄漏以及哪里泄漏了内存 当启用 ARC 时 我们是否必须处理内存泄漏 即使ARC可能会发生内存泄漏 它
  • ProGuard 不会用依赖项混淆 JAR

    我有一个项目pom xml下面给出的文件 当我发出命令时mvn clean compile assembly single install我希望 Maven 生成一个 JAR 其中包含 所有依赖项和 我的代码的混淆版本 它不起作用 我的代码
  • 使用 PDO 和准备好的语句进行 MySQL 更新不起作用

    我在使用 php PDO 和 mysql 时遇到一个奇怪的问题 我有下表 create table test table id integer value text 单行 insert into test table values 1 as
  • 将创建的图像文件追加到 formdata 中

    我使用画布创建了图像 我想在表单数据中附加确切的图像文件而不是网址 这是我的代码
  • 在池中使用多个 Memcache 服务器

    我正在查看文档 对于指定多个服务器时 memcache 如何进行内部负载平衡有点困惑 例如 import memcache mc set servers 127 0 0 1 11211 127 0 0 1 11212 mc set some
  • 如何开始使用 Solr.NET

    嘿 我想知道如何开始使用 Solr NET 甚至是基础知识 要下载哪些文件等 我当然检查了网络 但就像每个网站都说不同的东西 有些网站比较旧 所以不确定 Cheers 看看这些问题 Solr 可用于 Net 吗 如何安装SOLRNET Se
  • Joda-Time 基于区域设置的日期时间格式

    我从另一个系统收到一个字符串日期 并且我知道该日期的区域设置 也可以从其他系统获得 我想把这个字符串转换成乔达时间 DateTime对象而不明确指定目标模式 例如 我想仅使用区域设置将此字符串 09 29 2014 转换为日期对象 而不是通
  • numpy 数组在 pyglet 中显示不正确

    我在使用 pyglet 显示 numpy 数组时遇到问题 我发现了一个非常相似的主题 如何使用 pyglet 显示 numpy 数组 我用过的 我想以灰度显示数组 但 pyglet 用颜色显示它 请参见图像 https i stack im
  • pycharm 不会对未使用的变量和导入发出警告

    突然我的 pycharm 停止警告未使用的变量或未使用的导入 将这些行着色为灰色 我在设置和检查中到处寻找 找不到问题所在 您可以通过以下方式再次启用它Settings gt Editor gt Inspections and in Pyt
  • cattr_accessor 位于 Rails 之外

    我正在尝试使用谷歌搜索ruby 库 代码如下 但它抱怨 cattr accessor是一个未定义的方法 有什么想法可能是这样或者我如何解决它 require rubygems require google search GoogleSear
  • SQL“LIKE”语法

    我正在编写一个需要在 mysql 和 postgresql 上运行的应用程序 我必须使用like比较一些值 在mysql中LIKE它不区分大小写 在 PostgreSQL 中LIKE它区分大小写并且ILIKE它不区分大小写 如果匹配必须不区
  • HTML 视频自动播放而不静音(或者 youtube 是如何做到的)?

    我知道许多较新的浏览器现在禁用autoplay当视频不存在时muted或将其静音然后播放 如果没有用户交互 也无法调用视频播放 这是可以理解的 但我想知道 youtube 如何仍然能够用声音开始视频 我查了一下 他们确实使用了视频标签 只是
  • Laravel redirect::route 在页面加载之间显示一条消息

    我目前正在使用 Laravel 开发一个网络应用程序 直到最近该应用程序都运行得很好 我不知道是什么触发了它 但这是我遇到的问题的摘要 登录过去可以正常工作 因为我有一个 AccountController 可以执行以下操作 auth Au
  • 实现安全 nullptr

    我想让我的代码在旧版 C 使用 NULL 的 C 代码 和新的 C 11 标准 使用 nullptr 的 C 代码 上都可编译 我正在使用 GCC 但计划在完成最重要的事情时也为 VS 重新编译整个代码库 我是否应该期望 GCC 和 VS