C和C++标准都没有指定某些数据类型的确切长度,只指定了它们的最小长度。
我有一个第三方库:someLib.lib
(为我的平台编译的)和它对应的someLib.h
。假设它包含以下函数:
int getNumber();
void setNumber(int number);
当我编译一个使用这个库的程序时,编译器会用someLib.h
中定义的签名检查类型,所以只要我使用int
s,一切都应该编译得很好。
但是,当我的编译器中的int
比用于编译someLib.lib
的编译器中的更长或更短时,会发生什么呢?在链接过程中会被检测到吗?它会导致运行时错误吗?在不知道someLib.lib
是如何编译的情况下,我可以安全地使用它吗?
发布于 2016-08-01 11:49:15
您不应该得到编译器或链接器错误,只有在运行时未定义的行为。可能会崩溃,或者如果你幸运的话只是奇怪的结果。
发布于 2016-08-01 11:53:57
使用对底层系统或编译器有狭义假设的库可能会导致问题。
因此,如果您正在使用的库假定int
是16位的,但是您在32位系统中使用它,那么在运行时就会出现问题。
好的实现库有#if
宏来最小化这些问题,或者它们已经为不同的系统实现了各种.lib
文件。他们甚至可以显式地使用intX_t
(例如int32_t
)整数,以使其更易于移植。
https://stackoverflow.com/questions/38698038
复制