_XPG4_2 和其他定义如何在 Solaris 上工作?

发布于 2024-07-25 11:26:38 字数 370 浏览 9 评论 0原文

在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. 某处有这些东西的列表吗?

这与

On Solaris, in order to get the msg_control field in struct msghdr and have IPV6_TCLASS I seem to need to define _XPG4_2 and __EXTENSIONS__.

It seems to work if I just define these to 1 before including anything:

#if defined (__SVR4) && defined (__sun)
# define _XPG4_2 1
# define __EXTENSIONS__ 1
#endif
  1. Should I do it this way?
  2. Do I need to define them in all source files, or bad things may happen?
  3. Is there a list of these things somewhere?

This is related to this question.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

檐上三寸雪 2024-08-01 11:26:38

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

X/开放 CAE
构建或编译符合以下之一的应用程序
X/Open CAE 规范,请遵循以下准则。
如果出现以下情况,应用程序无需设置 POSIX 功能测试宏:
它们需要 CAE 和 POSIX 功能。

<前><代码> SUS (XPG4v2)
应用程序必须定义 _XOPEN_SOURCE 的值
500 以外(最好是 1)并设置
_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

man -k XPG4 reveals that there is a standards(5) man page, which lists the feature test macros and library linking info for various standards, including the following:

X/Open CAE
To build or compile an application that conforms to one of
the X/Open CAE specifications, use the following guidelines.
Applications need not set the POSIX feature test macros if
they require both CAE and POSIX functionality.

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

Grepping through /usr/include for _XOPEN_SOURCE turns more information in /usr/include/sys/feature_tests.h:

application writers wishing to use any functions specified as X/Open UNIX Extension must define _XOPEN_SOURCE and _XOPEN_SOURCE_EXTENDED=1. The Sun internal macro _XPG4_2 should not be used in its place as unexpected results may occur.

So defining _XPG4_2 yourself is not the way to do it.

If any structure definitions depend on these macros, you would definitely be better off defining them in all translation units. The easiest way to do that is to specify them on the compiler command line:

cc -D_XOPEN_SOURCE=1 -D_XOPEN_SOURCE_EXTENDED=1

If you're using make, you should be able to do this by adding the -D parameters to the CFLAGS variable:

CFLAGS += -D_XOPEN_SOURCE=1 -D_XOPEN_SOURCE_EXTENDED=1
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文