如何检测SunOS上的SparcWorks?解决遗留C++代码编译冲突
解决遗留C++代码与glibc函数原型冲突的预处理方案
可以利用预定义宏精准屏蔽仅针对旧SunOS/SparcWorks的兼容代码,以下是几种可靠的方案:
基于glibc版本精准判断
针对Fedora 39(对应glibc-2.38及以上)环境,直接通过__GLIBC__和__GLIBC_MINOR__宏判断:
#if defined(__GLIBC__) && (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 38)) // 空块,在符合条件的环境下屏蔽后续兼容代码 #else // 原有的SparcWorks兼容函数原型 void free(char* ptr); char* malloc(size_t size); char* memalign(size_t alignment, size_t size); #endif
跨平台通用判断
如果需要覆盖所有标准C环境(排除旧版SparcWorks),结合平台与编译器版本宏:
#if !defined(__sun__) || (defined(__SUNPRO_CC) && __SUNPRO_CC > 0x301) // 屏蔽冲突代码 #else // 原兼容代码 void free(char* ptr); char* malloc(size_t size); char* memalign(size_t alignment, size_t size); #endif
__sun__是SunOS/Solaris平台的预定义宏__SUNPRO_CC是SparcWorks编译器的版本标识,0x301对应3.0.1版本,高于该版本的编译器已修复函数原型错误
基于C标准版本判断
若环境遵循C99及以上标准,无需兼容旧代码,可使用__STDC_VERSION__宏:
#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L // 屏蔽冲突代码 #else // 原兼容代码 void free(char* ptr); char* malloc(size_t size); char* memalign(size_t alignment, size_t size); #endif
内容的提问来源于stack exchange,提问作者vonbrand
相关产品推荐
相关产品推荐

