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 #include
s 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 #define
s you have, for example with basename(3).
See also: