C和C ++标准都没有指定某些数据类型的确切长度,只指定了它们的最小长度。
我有第三方库:someLib.lib
(为我的平台编译)及其对应的someLib.h
。让我们说它包含以下功能:
int getNumber();
void setNumber(int number);
当我编译一个使用这个库的程序时,编译器会检查带有someLib.h
中定义的签名的类型,所以只要我使用int
s,一切都应该编译好。
但是在我的编译器int
中发生的事情比使用编译someLib.lib
的编译器更长或更短时会发生什么?在链接期间会被检测到吗?它会导致运行时错误吗?我可以安全地使用someLib.lib
而不知道它是如何编译的吗?
答案 0 :(得分:3)
您不应该在运行时遇到编译器或链接器错误,只有未定义的行为。可能会崩溃,或者如果你很幸运,那就是奇怪的结果。
答案 1 :(得分:1)
使用对底层系统或编译器有狭义假设的库可能会导致问题。
因此,如果您使用的库假设int
为16位但您在32位系统中使用它,那么您在运行时会遇到问题 - 时间。
良好实施的库具有#if
个宏来最小化这些问题,或者他们已经为不同的系统实现了各种.lib
文件。他们甚至可以明确地使用intX_t
(例如int32_t
)整数来提高可移植性。