_XPG4_2和其他定义如何在Solaris上运行?

时间:2009-06-23 19:19:28

标签: c sockets network-programming solaris

在Solaris上,为了获取struct msghdr中的msg_control字段并拥有IPV6_TCLASS,我似乎需要定义_XPG4_2和__EXTENSIONS __。

如果我在包含任何内容之前将这些定义为1,似乎有效:

#if defined (__SVR4) && defined (__sun)
# define _XPG4_2 1
# define __EXTENSIONS__ 1
#endif
  1. 我应该这样做吗?
  2. 我是否需要在所有源文件中定义它们,否则可能会发生不好的事情?
  3. 某处有这些东西的清单吗?
  4. 这与this question

    有关

1 个答案:

答案 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