What does -D_XOPEN_SOURCE do/mean?

When you do

#define _XOPEN_SOURCE <some number>

or

cc -D_XOPEN_SOURCE=<some number>

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

Leave a Comment

Hata!: SQLSTATE[HY000] [1045] Access denied for user 'divattrend_liink'@'localhost' (using password: YES)