在Solaris上,为了获取struct msghdr中的msg_control字段并拥有IPV6_TCLASS,我似乎需要定义_XPG4_2和__EXTENSIONS __。
如果我在包含任何内容之前将这些定义为1,似乎有效:
#if defined (__SVR4) && defined (__sun)
# define _XPG4_2 1
# define __EXTENSIONS__ 1
#endif
答案 0 :(得分:10)
man -k XPG4
显示有一个standards(5)
手册页,其中列出了各种标准的功能测试宏和库链接信息,包括以下内容:
X / Open CAE 构建或编译符合其中一个的应用程序 X / Open CAE规范,请遵循以下准则。 如果,应用程序无需设置POSIX功能测试宏 它们需要CAE和POSIX功能。
SUS (XPG4v2) The application must define _XOPEN_SOURCE with a value other than 500 (preferably 1) and set _XOPEN_SOURCE_EXTENDED=1.
为/usr/include
点击_XOPEN_SOURCE
,可在/usr/include/sys/feature_tests.h
中获取更多信息:
希望使用指定为X / Open UNIX Extension的任何函数的应用程序编写者必须定义
_XOPEN_SOURCE
和_XOPEN_SOURCE_EXTENDED=1
。不应使用Sun内部宏_XPG4_2
,因为可能会出现意外结果。
因此,自己定义_XPG4_2
并非如此。
如果任何结构定义依赖于这些宏,那么在所有翻译单元中定义它们肯定会更好。最简单的方法是在编译器命令行中指定它们:
cc -D_XOPEN_SOURCE=1 -D_XOPEN_SOURCE_EXTENDED=1
如果您使用make
,则应该可以通过将-D
参数添加到CFLAGS
变量来执行此操作:
CFLAGS += -D_XOPEN_SOURCE=1 -D_XOPEN_SOURCE_EXTENDED=1