11得票4回答
在C和C++中通过联合体进行结构体类型切换

我使用gcc和g++编译并开启pedantic选项,但两者都没有警告:#include <stdio.h> #include <stdlib.h> #include <string.h> struct a { struct a *next; ...

11得票3回答
在C/C++中将uint32_t按位转换为float

我从网络接收到一个缓冲区,该缓冲区已转换为32位字的数组。我的接口文档将其中一个字定义为IEEE-754浮点数。我需要从缓冲区中提取这个字。但是,在不进行转换的情况下从一种类型强制转换为另一种类型很困难。这些位已经符合IEEE-754浮点数标准,我不想重新排列任何位。我的第一次尝试是将uint...

11得票1回答
FBString的小字符串优化是否依赖于未定义行为?

Facebook的fbstring_core类使用在这个演讲中描述的"Small String Optimization",其中类的数据成员的存储 - 一个Char*,size和capacity - 如果字符串足够小,则将被重新用于存储字符数据。用于区分这些情况的标志位位于存储的"最右侧字符"...

11得票5回答
在C语言中安全地将char*转换为double

在我编写的一个开源项目中pgdbf中,我正在从文件中读取二进制数据(由其他程序编写),并输出整数(ints)、双精度浮点数(doubles)和其他各种数据类型。其中一个挑战是它需要在32位和64位机器上运行,并且支持大端和小端存储方式,这意味着我不得不进行相当多的底层位操作(bit-twidd...

11得票1回答
通用的基于char[]的存储和避免与strict-aliasing相关的未定义行为

我正在尝试构建一个类模板,将一堆类型打包到一个足够大的char数组中,并允许按正确类型引用访问数据。 根据标准,这可能导致严格别名违规,因此未定义行为,因为我们通过与其不兼容的对象访问char[]数据。 具体来说,标准规定: 如果程序尝试通过其他类型的glvalue访问对象的存储值,则行为是...

11得票3回答
std::array能否作为大数组的一个片段别名?

假设我们有一个指针T *ptr;,并且ptr、ptr+1、... ptr+(n-1)都引用了类型T的有效对象。 是否可以像STL array一样访问它们?或者以下代码是否可行: std::array<T,n>* ay = (std::array<T,n>*) ptr...

10得票5回答
以下的C语言联合体访问模式是否属于未定义行为?

在现代C语言中,以下内容不属于未定义行为:union foo { int i; float f; }; union foo bar; bar.f = 1.0f; printf("%08x\n", bar.i); 并打印出1.0f的十六进制表示。 但是下面的行为未定义:int ...

10得票2回答
nullptr_t会破坏类型游戏或指针转换吗?

考虑这个联盟: typedef union { void* vptr; nullptr_t nptr; } pun_intended; nullptr_t据说与void*兼容1)。那么,如果我们将void*初始化为非零值会怎么样? pun_intended foo ...

9得票2回答
C语言中的多态性、类型转换和严格别名规则。这样做是否合法?

我一直在试图弄清楚以下内容的法律性质,我真的需要帮助。 #include <stdio.h> #include <stdlib.h> typedef struct foo { int foo; int bar; } foo; void make_f...

9得票3回答
C++中的严格别名规则和类型别名

我正在尝试理解违反严格别名规则时的未定义行为。我已经阅读了许多关于此问题的文章,但仍有一个问题:我不太明白两种类型何时非法别名。cpp-reference指出: 类型别名 每当试图通过类型为AliasedType的glvalue读取或修改DynamicType类型对象的存储值时,除非以下情...