【问题标题】: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
  1. 我应该这样做吗?
  2. 是否需要在所有源文件中定义它们,否则可能会发生坏事?
  3. 在某处有这些东西的清单吗?

这与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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-03
      • 2018-08-31
      • 2011-01-05
      • 1970-01-01
      • 1970-01-01
      • 2014-01-14
      • 1970-01-01
      • 2016-06-05
      相关资源
      最近更新 更多