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

Tho*_*mas 3 c sockets solaris network-programming

在Solaris上,为了获取struct msghdr中的msg_control字段并具有IPV6_TCLASS,我似乎需要定义_XPG4_2和__EXTENSIONS__.

如果我在包含任何东西之前将它们定义为1,它似乎有效:

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

这与这个问题有关.

bk1*_*k1e 10

man -k XPG4揭示有一个standards(5)手册页,其中列出了各种标准的功能测试宏和库链接信息,包括以下内容:

X/Open CAE要构建或编译符合其中一个X/Open CAE规范的应用程序,请使用以下准则.如果需要CAE和POSIX功能,应用程序无需设置POSIX功能测试宏.

 SUS (XPG4v2)
       The application must define _XOPEN_SOURCE with a value
       other    than    500    (preferably    1)    and   set
       _XOPEN_SOURCE_EXTENDED=1.
Run Code Online (Sandbox Code Playgroud)

通过/usr/include以下方式获取_XOPEN_SOURCE更多信息/usr/include/sys/feature_tests.h:

希望使用指定为X/Open UNIX Extension的任何函数的应用程序编写者必须定义_XOPEN_SOURCE_XOPEN_SOURCE_EXTENDED=1._XPG4_2不应使用Sun内部宏,因为可能会出现意外结果.

因此,定义_XPG4_2自己不是实现目标的方式.

如果任何结构定义依赖于这些宏,那么在所有翻译单元中定义它们肯定会更好.最简单的方法是在编译器命令行上指定它们:

cc -D_XOPEN_SOURCE=1 -D_XOPEN_SOURCE_EXTENDED=1
Run Code Online (Sandbox Code Playgroud)

如果您正在使用make,您应该可以通过向变量添加-D参数来执行此操作CFLAGS:

CFLAGS += -D_XOPEN_SOURCE=1 -D_XOPEN_SOURCE_EXTENDED=1
Run Code Online (Sandbox Code Playgroud)