从Solaris 10迁移至Solaris 11时uint64_t未定义问题的正确修复方式
32位Solaris 11编译时uint64_t未定义问题的正确修复方式
问题背景
将遗留产品的C/C++开发环境从Solaris 10迁移到32位Solaris 11后,编译阶段出现uint64_t未定义的错误。排查发现Solaris 11新增了包含这类固定宽度整数类型的系统头文件,而Solaris 10没有;按C99标准,32位系统本应支持uint64_t,但查看int_types.h后发现,必须定义_LONGLONG_TYPE才能启用该类型。
直接定义_LONGLONG_TYPE的问题
直接在Makefile中添加-D_LONGLONG_TYPE会触发编译错误:
"/usr/include/sys/feature_tests.h", line 394: #error: "No long long in strictly conforming ANSI C & 1990 ISO C environments"
这是因为Solaris的头文件会严格检查编译环境的标准模式,直接定义_LONGLONG_TYPE绕过了标准检查,违反了ANSI C(C90)的严格约束。
使用-D_STDC_C99是正确的修复方式
改用-D_STDC_C99能正常编译,这个方案是合理的,原因如下:
- C99标准明确要求支持
uint64_t这类固定宽度整数类型,完全匹配你的需求 - 定义
_STDC_C99后,Solaris的feature_tests.h会自动启用C99相关特性,其中就包括自动定义_LONGLONG_TYPE,既满足了头文件的要求,又符合标准规范 - 对于遗留代码来说,只要代码本身没有依赖C90的严格特性,这个选项不会引入兼容性问题;Solaris 10的编译环境可能默认使用了非严格的C模式,迁移到Solaris 11后明确指定C99标准是合理的适配动作
如果是C代码,也可以考虑用-std=c++98或更高版本的标准选项(如果代码兼容),不过-D_STDC_C99在C/C混合环境中也能正常工作。
内容的提问来源于stack exchange,提问作者Brie
相关产品推荐
相关产品推荐

