【发布时间】:2019-03-27 08:35:03
【问题描述】:
我有一个编译为使用 32 位有符号整数的库。当其他应用程序使用标志编译它们时,例如:-DODBC64 它将我在库中使用的相同类型提升为 64 位有符号整数。 例如:
#ifdef ODBC64
typedef sint64 SLEN;
#else
#define SLEN int
#endif
当应用程序将引用传递给我的库时:
SLEN count;
mylibraryfunction(&count);
返回给应用程序的值如下所示:
sizeof(SLEN) = 8
sizeof(SLEN) in my library = 4
m_AffectedRows BEFORE = 0x3030303030303030
m_AffectedRows AFTER = 0x3030303000000000 0
您可以看到我的库中的分配正在复制 4 个字节(值 0)。 我需要知道一种将高 4 字节重置为 0 的方法。 例如:
0x0000000000000000
我尝试过 static_cast 和 reinterpret_cast,但都没有帮助。
【问题讨论】:
-
这很关键。您通过地址将 64 位
int传递给一个函数,该函数将其解释为 32 位int信任它的声明。这是因为链接器无法识别同名符号的不同类型,并且可能会在没有任何警告的情况下链接它,但它仍然是错误的。 -
这听起来确实很危险。有什么理由让一侧有 32 位,另一侧有 64 位?如果是这样,我建议为每个函数编写一个小包装器,它只是进行类型转换(并且可能检查溢出)。
-
我会提供 2 个不同版本的库吗?一次用于 8 字节使用量,一次用于它们可以链接的应用程序的 4 字节使用量。
-
我不清楚为什么你需要不同的 int 大小。您是为 x86-32 和 x86-64 编译,还是 32 位版本节省大量内存?
-
这就是为什么我们应该使用 stdint.h 类型而不是一些本地车库标准...