What does -D_XOPEN_SOURCE do/mean?

后端 未结 4 487
自闭症患者
自闭症患者 2020-11-29 19:33

I recently encountered some code that gcc would not compile without this arg. I checked the gcc man page, but did not find this specific option. I did find XOPEN_SOURC

4条回答
  •  时光说笑
    2020-11-29 19:56

    When you do

    #define _XOPEN_SOURCE 
    

    or

    cc -D_XOPEN_SOURCE=
    

    it tells your compiler to include definitions for some extra functions that are defined in the X/Open and POSIX standards.

    This will give you some extra functionality that exists on most recent UNIX/BSD/Linux systems, but probably doesn't exist on other systems such as Windows.

    The numbers refer to different versions of the standard.

    • 500 - X/Open 5, incorporating POSIX 1995
    • 600 - X/Open 6, incorporating POSIX 2004
    • 700 - X/Open 7, incorporating POSIX 2008

    You can tell which one you need (if any) by looking at the man page for each function you call.

    For example, man strdup says:

       Feature Test Macro Requirements for glibc (see feature_test_macros(7)):
    
           strdup(): _SVID_SOURCE || _BSD_SOURCE || _XOPEN_SOURCE >= 500
           strndup(), strdupa(), strndupa(): _GNU_SOURCE
    

    Which means that you should put one of these:

    #define _SVID_SOURCE
    #define _BSD_SOURCE
    #define _XOPEN_SOURCE 500
    #define _XOPEN_SOURCE 600
    #define _XOPEN_SOURCE 700
    

    at the top of your source file before doing any #includes if you want to use strdup.

    Or you could put

    #define _GNU_SOURCE
    

    there instead, which enables all functionality, with the downside that it might not compile on Solaris, FreeBSD, Mac OS X, etc.

    It's a good idea to check each man page before doing a #include, #define, or using a new function, because sometimes their behavior changes depending on what options and #defines you have, for example with basename(3).

    See also:

    • Linux: gcc with -std=c99 complains about not knowing struct timespec
    • glibc feature test macros
    • The Compilation Environment - Open Group Base Specification issue 6 (a.k.a. X/Open 6)
    • POSIX - Wikipedia
    • Single UNIX Specification - Wikipedia

提交回复
热议问题