【问题标题】:How does _XPG4_2 and other defines work on Solaris?_XPG4_2 和其他定义如何在 Solaris 上工作?
【发布时间】:2009-06-23 19:19:28
【问题描述】:
在 Solaris 上,为了获得 struct msghdr 中的 msg_control 字段并拥有 IPV6_TCLASS,我似乎需要定义 _XPG4_2 和 __EXTENSIONS__。
如果我在包含任何内容之前将这些定义为 1,这似乎可行:
#if defined (__SVR4) && defined (__sun)
# define _XPG4_2 1
# define __EXTENSIONS__ 1
#endif
- 我应该这样做吗?
- 是否需要在所有源文件中定义它们,否则可能会发生坏事?
- 在某处有这些东西的清单吗?
这与this question有关。
【问题讨论】:
标签:
c
sockets
network-programming
solaris
【解决方案1】:
man -k XPG4 透露有一个 standards(5) 手册页,其中列出了各种标准的功能测试宏和库链接信息,包括以下内容:
X/打开 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 扩展的任何功能的应用程序编写者必须定义 _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