5

我需要匹配调用getnameinfo的签名,以便我可以围绕该调用编写一个包装器。不幸的是,主机之间的签名会发生变化。

在我尝试在最新的 CentOS 6.3 上进行编译之前,事情一直在工作并找到,这给出了错误:

error: conflicting types for 'getnameinfo' 

嗯?

事实证明,最后一个参数 flags 在 CentOS (glibc-headers-2.12-1.80) 上被列为 unsigned int,但在 Fedora (glibc-headers-2.15-58) 上只是一个 int。(请注意,两台主机上的手册页都说它应该是一个 int。)

extern int getnameinfo ( /*cut*/, unsigned int __flags);

对比

extern int getnameinfo ( /*cut*/, int __flags);

一些搜索让我相信标准已经改变了 flags 参数的类型。

看起来我需要更改函数中的标志类型以匹配主机的定义。处理这个问题的最佳方法是什么?这是一个自动配置类型的问题还是有一些更简单的解决方案?我希望编译器(gcc)有一些我可以利用的宏,但我找不到任何东西。

4

1 回答 1

3

您可以检查__GLIBC_MINOR__定义的宏features.h并相应地传递参数,例如:

#include <features.h>

#if __GLIBC_MINOR__ > 12 
    getnameinfo(..., flags);
#else 
    getnameinfo(..., (unsigned) flags);
#endif
于 2013-02-15T20:21:22.760 回答