- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我试图编写一些宏以确保 _Bool
的类型安全使用,然后对我的代码进行压力测试。为了邪恶的测试目的,我想出了这个肮脏的黑客:
_Bool b=0;
*(unsigned char*)&b = 42;
鉴于 _Bool
在实现 sizeof(_Bool)==1
) 上是 1 个字节,我看不出这个 hack 如何违反 C 标准。它不应该是严格的别名违规。
然而,当通过各种编译器运行这个程序时,我遇到了问题:
#include <stdio.h>
int main(void)
{
_Static_assert(sizeof(_Bool)==1, "_Bool is not 1 byte");
_Bool b=0;
*(unsigned char*)&b = 42;
printf("%d ", b);
printf("%d", b!=0 );
return 0;
}
(代码依赖于 printf
隐式默认参数提升为 int
)
某些版本的 gcc 和 clang 输出 42 42
,其他版本输出 0 0
。即使禁用优化。我会期望 42 1
。
编译器似乎假定 _Bool
只能是 1
或 0
,但同时它很乐意打印 42
在第一种情况下。
Q1:这是为什么?上面的代码是否包含未定义的行为?
Q2:sizeof(_Bool)
的可靠性如何? C17 6.5.3.4 根本没有提到 _Bool
。
最佳答案
Q1: Why is this? Does the above code contain undefined behavior?
是的,确实如此。该存储是有效的,但随后将其读取为 _Bool
则无效。
6.2.6 Representations of types
6.2.6.1 General
5 Certain object representations need not represent a value of the object type. If the stored value of an object has such a representation and is read by an lvalue expression that does not have character type, the behavior is undefined. [...]
Q2: How reliable is
sizeof(_Bool)
? C17 6.5.3.4 does not mention_Bool
at all.
它会可靠地告诉您存储一个 _Bool
所需的字节数。 6.5.3.4 也没有提到 int
,但你不是在问 sizeof(int)
是否可靠,是吗?
关于c - _Bool 类型和严格的别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52163870/
我用 C 语言编写了一组数据结构和函数,其中一些使用 _Bool 数据类型。当我开始时,项目将是纯 C。现在我正在研究使用基于 C++ 的 GUI 工具包,并将后端代码制作成库。 但是,在编译 C++
传统上,C 中的 boolean 值用 int 表示。或 char .新款_Bool type 使意图更清晰,但还有另一个有趣的功能:它似乎将浮点数转换为它,不会向零截断,而是与精确的零进行比较: #
如果 _Bool 类型的行为类似于整数并且不强制值是真/假或 1/0,例如: _Bool bools[] = {0,3,'c',0x17}; printf("%d", bools[2]); > 1 在
我试图编写一些宏以确保 _Bool 的类型安全使用,然后对我的代码进行压力测试。为了邪恶的测试目的,我想出了这个肮脏的黑客: _Bool b=0; *(unsigned char*)&b = 42;
C 标准将 _Bool 定义为包含 0 或 1 的无符号类型。如果 _Bool 类型的值 1 递增,据我所知,有两个选项: 该值在 1 到 0 之间环绕 该值增加到 2,它是非零值,因此在转换回 _B
下面的代码: _Bool field0; char field1; printf("fieldX: [%d]\t[%d]\n", field0, fiel
这个问题已经有答案了: Need for _Bool in C99? (4 个回答) 已关闭 9 年前。 至于stdbool.h ,我可以看到有些人想要 true 的常量和false和一个名为 boo
this 的答案关于 SO 的问题指定 _Bool 是在 C99 中引入的(特别是BobbyShaftoe 的回答)。 但是下面的代码可以与 gcc -std=c90 -pedantic test.c
我正在学习 C _Generic。这是问题:为什么我无法成功编译下面的代码?它只会将错误作为标题发出。 #include #define EVALUATE(X) _Generic((X), _Boo
使用 printf(),我可以将 %hhu 用于 unsigned char,将 %hi 用于 short int,%zu 用于 size_t,%tx 用于 ptrdiff_t 等. 我为 _Bool
我正在VS2013中编译以下代码, #if (__STDC_VERSION__ >= 199901L) /* Inactive pre-processor block */ #else /* Acti
#include #include #include int main(void) { _Bool = b1; printf("1 = Wahr, 0 = Unwahr\n"); b1 = ge
我正在读一本关于 C 的书。它说C99增加了一个数据类型_Bool。它基本上是一个 int 但只存储 0 或 1。现在我不明白为什么需要这样的数据类型。我们已经有了 bool,它隐含地转换为 int,
每当我需要 boolean 类型时,我都会被告知要么创建一个,要么使用 stdbool.h 更好。 由于 stdbool.h 使用 typedef bool _Bool,是否有理由使用 header
假设我们有一个 int 并希望以 boolean 方式在 0 和 1 之间切换它。我想到了以下几种可能: int value = 0; // May as well be 1 value = valu
为什么 C 使用单词 _Bool 来定义 bool 值?而他们使用单词 float 而不是 _Float? 此外,为什么必须包含 bool,为什么不是基本功能的一部分,例如 float? 最佳答案 _
这个问题在这里已经有了答案: Why does sscanf not work properly with a bool type (6 个答案) 关闭 9 年前。 我对我用 C 编写的这段代码有疑
错误 方法 -[EAzureBlobStorageFile configure:key:container:token:] 中存在未知参数类型“_Bool”。扩展 RCTConvert 以支持此类型。
从 C99 开始,C 现在有了一个合适的 boolean 类型,_Bool。 Objective-C 作为 C 的严格超集,继承了这一点,但是在 1980 年代创建时,没有 C boolean 类型,
我想到了 C 和 bool 我们使用 boolean 类型来声明对象,该对象只能保存 0 或 1 的值。例如: _Bool bin = 1; 或 bool bin = 1; (注:bool是stdbo
我是一名优秀的程序员,十分优秀!