我正在使用来自Visual C ++ 2008的gcc编译代码。代码使用的是errno_t,但在某些版本的gcc头文件中包含<errno.h>
并未定义类型。如何检测类型是否已定义?是否有定义信号表明类型已定义?在没有定义的情况下,我想提供typedef让代码在所有平台上正确编译。
答案 0 :(得分:6)
微软的errno_t
是多余的。 {C}标准将errno
定义为int
类型的可修改左值。如果您的代码需要存储errno
值,那么您应该将它们放入int
。
进行全局搜索并替换s/errno_t/int/
,您就完成了。
修改:此外,您不应在代码中提供typedef int errno_t
,因为所有以_t
结尾的名称都会被保留。
答案 1 :(得分:2)
你不能以宏的方式检查typedef,所以这有点棘手。如果您使用autoconf
,则this patch会显示您需要进行autoconf检查是否存在errno_t
所需的最小更改,并在缺少时将其定义(typedef将放置在包含您生成的config.h
的文件,包含在需要errno_t
的所有文件中。如果你没有使用autoconf
,你需要想出一些方法在你的构建系统中做同样的事情,或者对编译器版本宏做一套非常聪明的测试。
答案 2 :(得分:0)
这通常是GNU autoconf来救援的情况。基本上,autoconf将生成一个配置脚本,该脚本可以检测各种与系统相关的功能,例如此类型是否存在以及如何定义。然后,在应用程序中包含生成的C头文件。
答案 3 :(得分:0)
如果您知道哪些版本的GCC给您带来了麻烦,您可以测试它们。您可以使用以下内容检查GCC的版本:
#if __GNUC__ == 3
...
#else
...
#endif