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.
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:
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…