【问题标题】:Different data type lengths in third party libraries第三方库中不同的数据类型长度
【发布时间】:2016-08-01 11:45:55
【问题描述】:

C 和 C++ 标准都没有指定某些数据类型的确切长度,只指定它们的最小长度。

我有一个第三方库:someLib.lib(为我的平台编译)及其对应的someLib.h。假设它包含以下功能:

int getNumber();
void setNumber(int number);

当我编译一个使用这个库的程序时,编译器会检查带有someLib.h中定义的签名的类型,所以只要我使用ints,一切都应该编译正常。

但是当我的编译器中的int 比使用编译器someLib.lib 的编译器更长或更短时会发生什么?链接时会被检测到吗?它会导致运行时错误吗?我可以在不知道它是如何编译的情况下安全地使用someLib.lib 吗?

【问题讨论】:

  • 对于像int 这样的简单类型,这几乎从来不是问题。出现此类问题的地方是具有不同填充的结构,具体取决于编译器差异,甚至只是同一编译器上的不同选项;或具有实现定义的详细信息(例如位字段)的功能。这就是在库中包含完全包含此类详细信息的不透明接口的原因之一。

标签: c++ c types compilation linker


【解决方案1】:

您不应该得到编译器或链接器错误,只会在运行时出现未定义的行为。可能会崩溃,或者如果你幸运的话只是奇怪的结果。

【讨论】:

  • 我会说如果你遇到崩溃你是幸运的,如果你得到奇怪的结果是不幸的。
【解决方案2】:

使用对底层系统或编译器有狭隘假设的库可能会导致问题。

因此,如果您使用的库假定 int 是 16 位的,但您在 32 位系统中使用它,您将在运行时遇到问题。

良好实现的库具有#if 宏来最大程度地减少这些问题,或者他们已经为不同的系统实现了各种.lib 文件。他们甚至可以显式使用intX_t(例如int32_t)整数来提高便携性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-09
    • 1970-01-01
    • 2011-12-30
    • 1970-01-01
    • 2016-07-23
    • 2021-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多