如果 bool 是 int 的宏,为什么它的大小不同?

2023-11-23

我希望有人能解释为什么

#include <stdbool.h>

printf("size of bool %d\n", sizeof(bool));
printf("size of int %d\n", sizeof(int));

输出到

size of bool 1
size of int 4

我看过http://pubs.opengroup.org/onlinepubs/009695399/basedefs/stdbool.h.html这似乎表明 bool 本质上是 _Bool 的宏,当设置为 true 或 false 时,它​​实际上只是整数常量的宏。如果是整数,为什么大小不一样呢?

我这么问是因为我们花了太长时间来调试一个没有分配足够内存的程序。


The _Bool输入 C99 (typedef'ed to bool in stdbool.h) 没有标准定义的尺寸,但根据 C99 标准第 6.2.5 节:

2 An object declared as type _Bool is large enough to store the values 0 and 1.

在 C 中,最小的可寻址对象(除了位域)是char,至少有 8 位宽,并且sizeof(char)总是1.

_Bool and bool因此有一个sizeof至少1,并且在我见过的大多数实现中,sizeof(bool) / sizeof(_Bool) is 1.

如果你看一下 GCC 的stdbool.h,你会得到这个:

 #define bool    _Bool
 #if __STDC_VERSION__ < 199901L && __GNUC__ < 3
 typedef int _Bool;
 #endif

 #define false   0
 #define true    1

所以如果编译时使用旧版本的GCC和旧版本的C标准,你将使用int as a _Bool type.

当然,有趣的是,看看这个:

#include <stdio.h>
#include <stdbool.h>

int main() {
   printf("%zu\n", sizeof(_Bool));
   printf("%zu\n", sizeof(true));
   printf("%zu\n", sizeof(false));

}

Output:

λ > ./a.out 
1
4
4

GCC 4.2.4、Clang 3.0 和 GCC 4.7.0 的输出都相同。正如 Trinithis 指出的那样,sizeof(true) and sizeof(false)产生更大的尺寸,因为它们采用 int 文字的大小,这至少是sizeof(int).

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

如果 bool 是 int 的宏,为什么它的大小不同? 的相关文章

  • EF Core 返回 null 关系,直到直接访问

    我有一些如下所示的模型 public class Mutant public long Id get set Relations public long OriginalCodeId get set public virtual Origi
  • 错误:表达式不可赋值三元运算符

    我有以下代码 MPLABX XC8 编译器给出此错误 错误 表达式不可分配 U1ERRIRbits RXFOIF uart1 oerr 1 uart1 oerr 0 这是相关代码部分 typedef union struct bool fe
  • SOAP Web 服务:多台服务器,一个接口

    我有一个场景 需要任意数量的服务器来提供相同的 SOAP Web 服务 我想生成一组代理类 并能够为它们提供一个位置 以便在运行时将它们指向不同的服务器 不幸的是 看起来好像wsdl port节点 子节点wsdl service 要求对特定
  • 每个元素的 asp.net Web 表单自定义错误消息

    我创建了一个 Web 应用程序 表单 以及后端 SQL 插入和查询 目前我正在显示所有用户错误消息 div style padding 1em div
  • 我担心我添加了太多接口

    我正在构建我的领域模型并继续重构它 正如我所做的那样 我发现我喜欢接口 因为它允许我根据接口为具体类型创建可重用的方法 控制器 视图 但是 我发现每次向域实体之一添加新属性时 我都会创建一个接口 例如 我有一个会员状态从抽象继承的对象Ent
  • 从图像创建半透明光标

    是否可以从图像创建光标并使其半透明 我目前正在拍摄自定义图像并覆盖鼠标光标图像 如果我可以将其设为半透明 那就太好了 但不是必需的 销售人员喜欢闪亮的 目前正在做这样的事情 Image cursorImage customImage Get
  • 如何在 C 中链接目标文件?失败并显示“架构 x86_64 的未定义符号”

    因此 我尝试在我的文件 file2 c 中使用另一个 C file1 c 文件中定义的函数 为了做到这一点 我包含了 file1 file1 h 的标头 但是 每当我尝试使用 gcc 编译文件时 我都会收到以下错误 Undefined sy
  • X 轴和 Z 轴上的 Quaternion.Slerp,无 Y 轴

    I am trying to rotate the Player about X Y and Z axis The Y axis should not move from last angle Example if I rotate 45
  • 使用 STL 流时如何格式化我自己的对象?

    我想将我自己的对象输出到 STL 流 但具有自定义格式 我想出了这样的东西 但由于我之前从未使用过 locale 和 imbue 所以我不知道这是否有意义以及如何实现 MyFacet 和operator 所以我的问题是 这是否有意义以及如何
  • 当我尝试传递临时地址作为参数时,它是一个 UB 吗?

    对于以下 C 代码 include
  • 更改私有模块片段是否会导致模块重新编译?

    On 此页面有关 C 20 模块功能 https www modernescpp com index php c 20 modules private module fragment and header units 我发现了这样的说法 借
  • main.cpp 是必需的吗?

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

    我正在用 C 语言编写一些软件 它递归地列出给定目录中的所有文件 现在我需要计算出内部碎片 我花了很长时间研究这个问题 发现 ext2 上的内部碎片只发生在最后一个块中 我知道理论上你应该能够从索引节点号获得第一个和最后一个块地址 但我不知
  • 为什么这个位图图像在加载后会改变大小?

    快速提问 我有这个1000 1000位图图像 我使用这个例程来加载它 private BitmapSource initialBitmap new BitmapImage new Uri C Users Desktop Original b
  • Clang 5.0 上的 vsprintf 和 vsnprintf [-Wformat-nonliteral] 警告

    我有这段代码 static void err doit int errnoflag int level const char fmt va list ap int errno save unsigned long n char buf MA
  • 在 Visual Studio 2012 Express 中设置 C++ 调试环境

    我需要调试的应用程序需要设置环境变量 这在 Visual Studio 2012 中似乎非常复杂 我想做类似的事情 set path c foo c bar c windows c program files application set
  • 使用未命名命名空间而不是静态命名空间

    我可以假设在未命名命名空间中声明的对象相当于static namespace int x 1 static int x 2 FWIK 在这两种情况下 x将具有静态存储期限和内部链接 声明为的对象的所有规则也是如此static适用于未命名名称
  • C# 多维数组解析

    我有一个多维数组 内容在调试器中看起来像这样 数组设置为 String s new String 6 4 A B Yes C A B Yes C A B No C A B Yes C A B Yes C A B Yes C A B No C
  • 在多线程环境中捕获信号

    我有一个大型程序 需要尽可能具有弹性 并且有大量线程 我需要捕获所有信号SIGBUS SIGSEGV 并在必要时重新初始化有问题的线程 或者禁用该线程以继续减少功能 我的第一个想法是做一个setjump 然后设置信号处理程序 可以记录问题
  • 将同步 zip 操作转换为异步

    我们有一个现有的库 其中一些方法需要转换为异步方法 但是我不确定如何使用以下方法执行此操作 错误处理已被删除 该方法的目的是压缩文件并将其保存到磁盘 请注意 zip 类不公开任何异步方法 public static bool ZipAndS

随机推荐

  • 我可以在同一进程中使用同一 DLL 的两个不兼容版本吗?

    我使用的是同一供应商生产的两个商业库 称为 VendorLibA 和 VendorLibB 这些库根据编译器版本 例如 VC7 VC8 分布为多个 DLL 这两个库都依赖于该供应商生成的另一个库 称为 VendorLibUtils 并包含在
  • python,Windows 10:在特定的虚拟桌面环境(工作空间)上启动应用程序

    我有 3 个不同的 Windows 10 虚拟桌面 当计算机启动时 我希望 python 加载不同虚拟桌面中的所有应用程序 现在我只能在桌面 1 中启动 我如何告诉 python 在桌面 2 和 3 中启动应用程序 我正在使用Python
  • 实现jqgrid单元格编辑日期选择器

    我知道由于引用 可以使用日期选择器进行单元格编辑here and here 但是 当我单击单元格时 没有显示日期选择器 下面是相关列的 colModel 条目 我有可用的日期选择器用户界面 在其他示例中 dataInit 没有用引号引起来
  • Xcode 6 - 将 segue 推送到同一视图控制器

    我有一个表视图控制器 点击单元格可以根据单元格中的数据类型触发许多不同类型的推送序列之一 正确segue的标识符在tableView didSelectRowAtIndexPath 中确定 然后使用self performSegueWith
  • 使用python进行Pytesseract外语提取

    我在 Windows 机器上使用 Python 2 7 Pytesseract 0 1 7 和 Tesseract ocr 3 05 01 我尝试提取韩语和俄语的文本 并且我确信我提取了 现在我需要将字符串与从图像中提取的字符串进行比较 我
  • hibernate如何访问私有字段?

    hibernate如何访问java类的私有字段 方法 例如设置 Id Thanks 正如 Crippledsmurf 所说 它使用反射 看反思 打破所有规则 and Hibernate 保留对象的契约
  • 为什么应该使用“using”关键字来访问我的基类方法?

    我编写了下面的代码来解释我的问题 如果我注释第 11 行 使用关键字 using 编译器不会编译该文件并显示此错误 invalid conversion from char to const char 好像没看到方法void action
  • 将新的过滤器功能与现有分页和过滤器 jQuery/Javascript 合并

    我的新表过滤功能遇到问题 当选择要过滤的报价时 会出现问题 过滤器不会显示表内所有可过滤数据中的行 而是仅过滤可见行减去分页隐藏的数据 最重要的是 当我单击 更多 以显示更多行时 表开始显示当前过滤器之外的数据 这不好 我还有另一个过滤功能
  • 将非常大的数字从十进制字符串转换为二进制表示形式? [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我有一个非常大的数字 大约有一千位十进制数字 我必须将其转换为其二进制表示形式 数字存储
  • 使用 JAXB 封送长原始类型

    为了使用 JAXB 编组长原始类型 我使用了 XmlJavaTypeAdapter注解 它将非字符串类型适配为字符串 即使它会抛出长类型错误 为什么会这样呢 我怎样才能在我的longid 属性 用户 java class User XmlI
  • 在 stacklayout 中动态添加按钮

    我想动态添加一个按钮StackLayout当单击 添加 按钮时 我写stacklayoutname children add button 它没有给我我正在寻找的东西 在 xaml 中
  • Angular 路由:实例创建与实例激活

    Angular Routing 文档提到了组件实例创建 组件实例激活和路由激活 这些文档没有解释这些概念的差异以及每次创建 激活的时间 问题 实例创建和实例激活有什么区别 实例激活和路由激活有什么区别 实例激活是否始终与实例创建同时发生 总
  • 在哪里初始化在 Interface Builder 中实例化的自定义 UIView?

    我有一个 UIView 的子类 它在 XIB 文件中实例化 我需要它进行一些初始化 设置一些变量并创建子视图 然而 我并不总是通过 Interface Builder 实例化这个视图 我也是以编程方式完成的 在这两种情况下 初始化需要相同
  • 呈现 UICollectionView 时防止 UICollectionViewCell 动画外观

    当用户执行某些操作时 我需要拉取UICollectionView从底部向上到一定高度 由于新状态是完全可选的 因此集合视图是在以这种方式呈现之前创建的 从下到上的动画是使用 NSLayoutConstraint 的更改来执行的constan
  • NodeJS 和 Express:“错误:自签名证书”

    我是 NodeJS 的初学者 我有一个非常简单的 Node Express 应用程序 它使用 PostGreSQL 作为数据库 我的 db js 文件如下所示 const Pool require pg module exports new
  • 用于对象适配的 IE 和边缘修复:覆盖;

    我在用着object fit cover 在我的 CSS 中指定特定页面上的图像 因为它们需要粘在同一页面上height 它在大多数浏览器中运行良好 但是当在 IE 或 Edge 中缩放浏览器时 图像的大小会调整为width not hei
  • TortoiseGit 问题:git 没有完全退出(退出代码 128)

    这是一些背景知识 我运行的是win7 我有私人 git 存储库并安装了适用于 Windows 的 Github 我不喜欢 Windows 客户端的 Github 缺乏功能 我安装了Windows版TortoiseGit 仍然保留Window
  • 非冲突变更的示例

    我试图了解 subversion 合并命令的详细信息 我认为理解同时也是冲突的变革和非冲突的变革之间的区别会有所帮助 这是此内容的后续内容thread 冲突的更改是指两个人都对同一个文件进行了更改 而这两个更改无法自动解决 1 让我们从一个
  • 是否可以在微服务应用程序中代理 POJO?

    我想避免在微服务应用程序中重复我的 POJO 所以我想知道是否有办法做到这一点 例如代理 我的意思是 有没有办法Service A访问定义在内部的 POJO 或其他类 接口 Service B无需物理创建这些 POJO 类文件Service
  • 如果 bool 是 int 的宏,为什么它的大小不同?

    我希望有人能解释为什么 include