开发者

What does -D_XOPEN_SOURCE do/mean?

开发者 https://www.devze.com 2023-02-18 14:26 出处:网络
I recently encountered some code that gcc would not compile without this arg. I checked the gcc man page, but did not f开发者_StackOverflowind this specific option. I did find XOPEN_SOURCE, but there

I recently encountered some code that gcc would not compile without this arg. I checked the gcc man page, but did not f开发者_StackOverflowind this specific option. I did find XOPEN_SOURCE, but there was little explanation of what it does.

Can someone please elaborate? I know -D_XOPEN_SOURCE can be set to different values, such 400, 600, but what do those do?


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


-D is a c compiler option to define a preprocessor variable. In this case _XOPEN_SOURCE.

This doesn't actually affect the behavior of the compiler itself, but rather changes how some libraries, e.g. the standard c library, behave. There are several options like this. In most cases they are in relation to some standard document about some UNIX specific programming interface, or some specific library vendor.

Defining one of them is sometimes necessary, because the behavior of some standard functions or even their signature can differ between standards. So you might have to use -D_XOPEN_SOURCE or something similar to turn on a compatibility mode.

Another possible usage of these flags is to make sure your source code stays within the limits of a certain standard, by turning of extensions offered by your C library implementation. This is one of the measures you could use to make sure that your code runs on as many platforms as possible.


This exposes the header to belong to a definition of a given norm, such as posix. The actual norm it belongs to is defined by the value (here 400 or 600 for instance). See this Reference for the norm/value binding.


For some unknown reason, Mac OS/X (XCode) requires 600 to define strdup(), even though it's in the 1995 specification. Mozilla and others have run into this...

0

精彩评论

暂无评论...
验证码 换一张
取 消