【发布时间】:2018-01-10 21:32:56
【问题描述】:
在一个 C/C++ 混合项目中,我发现了一些可以简化为的代码
#include <mem.h>
struct StructContainingDouble
{
double d;
/// other elements omitted
};
void clear(StructContainingDouble* p)
{
memset(p, 0, sizeof *p);
}
不停止 Cppcheck 以引发可移植性警告
在包含浮点数的结构上使用 memset()。
消息是正确的,但是由于浮点数被声明为双精度,它似乎是误报,因为双精度中的(正)零值是按照 IEEE 754 标准编码的:[*]
0 00000000000 0000000000000000000000000000000000000000000000000000
所以我倾向于简单地压制警告并忘记它
void clear(ContainingDouble* p)
{
// cppcheck-suppress memsetClassFloat
memset(p, 0, sizeof *p);
}
但也许这里真的存在可移植性问题?
附录:
实际代码基于Win32平台。该结构用于管理对shared memory 的访问,这就是构造函数无用的原因。不仅是该结构中的一个对象必须归零,而且它的数组也嵌入到另一个结构中,如下所示:
#include <mem.h>
struct Slot
{
double d;
// more members...
};
struct SharedMem
{
Slot slots[2048];
// more members...
};
void clear(SharedMem* p)
{
memset(p, 0, sizeof *p);
}
【问题讨论】:
-
C 语言不保证 IEEE 754 浮点数。
-
@interjay 很有趣,但是 C++ 呢?是否有一些包含它的 C 标准?就我而言,它是一个 C++ 项目,其中包含一些旧的(样式)C 代码。
-
C++ 也不保证 IEEE 754。
-
1) 只有一种 C 和一种 C++ 标准。 2)没有“C(C ++”语言。它们是不同的语言,对于相同的语法/名称,您不能假设相同的行为。在C中没有可移植的方法将除整数类型之外的对象归零。使用“零-结构”和
memcpy. -
这可能是因为人们可能会根据您的实际操作提出替代方案。你没有列出其他成员。您知道
nullptr的位模式也不必为零吗?但我再次不敢相信 Windows 机器会出现这种情况。归零只能(完全可移植)初始化整数类型。
标签: c++ c double portability cppcheck