为什么编译器没有预定义 NULL

2023-11-26

这个问题困扰了我一段时间。我从未见过 NULL 的不同定义,它总是

#define NULL  ((void *) 0)

是否有任何体系结构对 NULL 进行了不同的定义,如果是这样,为什么编译器不为我们声明这一点?


C 2011 标准,在线草稿

6.3.2.3 Pointers
...
3 An integer constant expression with the value 0, or such an expression cast to type void *, is called a null pointer constant.66) If a null pointer constant is converted to a pointer type, the resulting pointer, called a null pointer, is guaranteed to compare unequal to a pointer to any object or function.
66) The macro NULL is defined in <stddef.h> (and other headers) as a null pointer constant; see 7.19.

The macro NULL is always定义为零值常量表达式;它可以是裸 0,或 0 转换为void *,或其他一些计算结果为 0 的整数表达式。就您而言源代码被关注到,NULL将始终评估为 0。

一旦代码被翻译,任何出现的空指针常量(0,NULL等)将被替换为底层架构用于空指针的任何内容,该指针可能是也可能不是 0 值。

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

为什么编译器没有预定义 NULL 的相关文章

随机推荐

  • Azure Blob 存储的事务访问

    我想将文件存储在 Azure Blob 存储中 到目前为止 一切都很好 我还想存储有关该文件的附加元数据 为此 我使用 Azure SQL 数据库 因此我可以轻松查询 Blob 存储上的文件 因此 当我向存储添加新文件时 我想确保 blob
  • 单行嵌套 For 循环[重复]

    这个问题在这里已经有答案了 用Python编写这个转置矩阵的函数 def transpose m height len m width len m 0 return m i j for i in range 0 height for j i
  • 设计问题:电话拨打电话号码,还是电话号码在电话上拨打自己?

    这是从我在 DDD Yahoo 上发布的内容重新发布的 团体 在所有条件相同的情况下 您是写phone dial phoneNumber 还是phoneNumber dialOn phone 请记住未来可能的需求 除了电话号码之外的帐号 除
  • 密码中是否应该允许使用空格字符?

    我尝试过不同的网站 产品 这似乎分配得相当均匀 Windows 7 和 Gmail 允许您在密码中插入空格 Hotmail 和 Twitter 则不然 虽然在密码中允许空格会增加密码的复杂性 但似乎许多网站 程序不允许它们 是否有充分的理由
  • 如何在 SPSS 中循环变量?我想避免代码重复

    是否有 原生 SPSS 方法来循环某些变量名称 我想做的就是获取变量列表 我定义的 并为它们运行相同的过程 伪代码 这不是一个很好的例子 但很能说明问题 for i in varlist a b c do FREQUENCIES VARIA
  • CLI/C++ 到底是什么?它与“普通”c++ 有什么不同?

    首先让我澄清一下 普通 C 的含义 我目前正在阅读 Walter Savitch 的 C 中的问题解决 据我所知 这不是专门为 Microsoft 或 Unix 编写的 所以我的问题是 我在这本书中学到的内容 我用它来获取 C 的通用知识
  • 旋转下拉列表在滚动时跳跃

    为什么我的旋转器在滚动时会跳跃 我只是做以下事情 ArrayAdapter
  • 为什么可以等待 Rx observable? [复制]

    这个问题在这里已经有答案了 我刚刚注意到await关键字可以与 Rx Observable 一起使用 例如 await Observable Interval TimeSpan FromHours 1 我非常确定它只能与任务结合使用 那么是
  • 如何刷新数据网格

    我创建 dojox grid datagrid 并填充数组中的内容 如示例所示页面上的最后一个示例 在一段时间内 我在代码中更改了该数组的值 如何刷新该网格的内容 如何从更改的数组加载新数据 要更改网格中的值 您需要更改网格存储中的值 网格
  • 找到到任何子串的最小汉明距离的最快方法?

    给定一个长字符串L和一个较短的字符串S 约束条件是L length 必须 gt S length 我想找到之间的最小汉明距离S和任意子串L长度等于S 长度 让我们为此调用该函数minHamming 例如 minHamming ABCDEFG
  • 在 Laravel 中,使用 App::make('') 而不是构造函数注入有什么缺点吗?

    通常我只会通过构造函数注入依赖项 但是当父类具有依赖项并且必须将它们传递给所有子类时 它会变得非常冗长 另一种方法是使用 this gt dependancy App make Dependancy 单独在父类中 那么父构造函数和子构造函数
  • ASCII 调整和十进制调整指令如何工作?

    我一直在努力理解 x86 汇编语言的 ASCII 调整指令 我在互联网上看到所有信息告诉我不同 的事情 但我想这只是以不同形式解释的同一件事 但我仍然不明白 谁能用伪代码解释一下为什么AAA AAS我们必须从 AL 的低位半字节中加 减 6
  • 如何使用 DOJO 动态显示和隐藏整个 TabContainer?

    DOJO 似乎有一些怪癖 我特别需要在页面加载时隐藏 TabContainer 但在用户单击按钮后变得可见 我尝试的第一件事是设置 style display none 来启动 然后在单击事件上设置 style display block
  • 在 C++/CLI 中使用 unique_ptr 时出现链接器错误

    我目前正在转换我的实例auto ptr to unique ptr 但我遇到了一个问题 它在代码的 C 部分中运行良好 但在我的托管 C CLI 层 该软件同时使用 C 和 C 中执行此操作时 我收到链接错误 它编译得很好 但在链接时会中断
  • eval 与函数构造函数

    我正在读关于eval在 MDN 上 它似乎表明有点 better 替代eval是使用一个函数构造器 MDN 似乎强调 与使用函数构造函数相比 使用函数构造函数的安全风险较小eval as 第三方代码可以看到调用 eval 的范围 这可能会导
  • 初学者摇摆

    我想创建一个简单的 Swing 应用程序 然而 我对 Swing 的经验非常非常少 我想创建一个单窗口应用程序 每 5 分钟刷新一次我所做的屏幕抓取内容 我正在使用 Clojure 来编写代码 我认为 Swing 是解决这个问题的方法 但如
  • sscanf 行为/返回值

    我是一名学习 C 的新手 并试图从在线讲座中理解以下代码 它扫描字符串中的整数 如果遇到字符 则 sscanf 失败 int n char c if sscanf string d c n c 1 return the integer el
  • 如何选择 git rebase 的合并策略?

    git rebase手册页提到 X
  • Mongo查询需要很长时间。怎么让它更快呢?

    我在 Node js 中使用 mongoose 驱动程序 我的架构 let sendResultSchema mongoose Schema emailId String email String letterId String sende
  • 为什么编译器没有预定义 NULL

    这个问题困扰了我一段时间 我从未见过 NULL 的不同定义 它总是 define NULL void 0 是否有任何体系结构对 NULL 进行了不同的定义 如果是这样 为什么编译器不为我们声明这一点 C 2011 标准 在线草稿 6 3 2