| .\" This manpage is Copyright (C) 2006, Michael Kerrisk |
| .\" |
| .\" %%%LICENSE_START(VERBATIM) |
| .\" Permission is granted to make and distribute verbatim copies of this |
| .\" manual provided the copyright notice and this permission notice are |
| .\" preserved on all copies. |
| .\" |
| .\" Permission is granted to copy and distribute modified versions of this |
| .\" manual under the conditions for verbatim copying, provided that the |
| .\" entire resulting derived work is distributed under the terms of a |
| .\" permission notice identical to this one. |
| .\" |
| .\" Since the Linux kernel and libraries are constantly changing, this |
| .\" manual page may be incorrect or out-of-date. The author(s) assume no |
| .\" responsibility for errors or omissions, or for damages resulting from |
| .\" the use of the information contained herein. The author(s) may not |
| .\" have taken the same level of care in the production of this manual, |
| .\" which is licensed free of charge, as they might when working |
| .\" professionally. |
| .\" |
| .\" Formatted or processed versions of this manual, if unaccompanied by |
| .\" the source, must acknowledge the copyright and authors of this work. |
| .\" %%%LICENSE_END |
| .\" |
| .TH FEATURE_TEST_MACROS 7 2021-03-22 "Linux" "Linux Programmer's Manual" |
| .SH NAME |
| feature_test_macros \- feature test macros |
| .SH DESCRIPTION |
| Feature test macros allow the programmer to control the definitions that |
| are exposed by system header files when a program is compiled. |
| .PP |
| .B NOTE: |
| In order to be effective, a feature test macro |
| .IR "must be defined before including any header files" . |
| This can be done either in the compilation command |
| .RI ( "cc \-DMACRO=value" ) |
| or by defining the macro within the source code before |
| including any headers. |
| The requirement that the macro must be defined before including any |
| header file exists because header files may freely include one another. |
| Thus, for example, in the following lines, defining the |
| .B _GNU_SOURCE |
| macro may have no effect because the header |
| .I <abc.h> |
| itself includes |
| .I <xyz.h> |
| (POSIX explicitly allows this): |
| .PP |
| .in +4n |
| .EX |
| #include <abc.h> |
| #define _GNU_SOURCE |
| #include <xyz.h> |
| .EE |
| .in |
| .PP |
| Some feature test macros are useful for creating portable applications, |
| by preventing nonstandard definitions from being exposed. |
| Other macros can be used to expose nonstandard definitions that |
| are not exposed by default. |
| .PP |
| The precise effects of each of the feature test macros described below |
| can be ascertained by inspecting the |
| .I <features.h> |
| header file. |
| .BR Note : |
| applications do |
| .I not |
| need to directly include |
| .IR <features.h> ; |
| indeed, doing so is actively discouraged. |
| See NOTES. |
| .SS Specification of feature test macro requirements in manual pages |
| When a function requires that a feature test macro is defined, |
| the manual page SYNOPSIS typically includes a note of the following form |
| (this example from the |
| .BR acct (2) |
| manual page): |
| .PP |
| .RS |
| .B #include <unistd.h> |
| .PP |
| .BI "int acct(const char *" filename ); |
| .PP |
| .RS -4 |
| .EX |
| Feature Test Macro Requirements for glibc (see |
| .BR feature_test_macros (7)): |
| .EE |
| .RE |
| .PP |
| .BR acct (): |
| _BSD_SOURCE || (_XOPEN_SOURCE && _XOPEN_SOURCE < 500) |
| .RE |
| .PP |
| The |
| .B || |
| means that in order to obtain the declaration of |
| .BR acct (2) |
| from |
| .IR <unistd.h> , |
| .I either |
| of the following macro |
| definitions must be made before including any header files: |
| .PP |
| .in +4n |
| .EX |
| #define _BSD_SOURCE |
| #define _XOPEN_SOURCE /* or any value < 500 */ |
| .EE |
| .in |
| .PP |
| Alternatively, equivalent definitions can be included in the |
| compilation command: |
| .PP |
| .in +4n |
| .EX |
| cc \-D_BSD_SOURCE |
| cc \-D_XOPEN_SOURCE # Or any value < 500 |
| .EE |
| .in |
| .PP |
| Note that, as described below, |
| .BR "some feature test macros are defined by default" , |
| so that it may not always be necessary to |
| explicitly specify the feature test macro(s) shown in the |
| SYNOPSIS. |
| .PP |
| In a few cases, manual pages use a shorthand for expressing the |
| feature test macro requirements (this example from |
| .BR readahead (2)): |
| .PP |
| .RS +4 |
| .EX |
| .B #define _GNU_SOURCE |
| .B #include <fcntl.h> |
| .PP |
| .BI "ssize_t readahead(int " fd ", off64_t *" offset ", size_t " count ); |
| .EE |
| .RE |
| .PP |
| This format is employed in cases where only a single |
| feature test macro can be used to expose the function |
| declaration, and that macro is not defined by default. |
| .SS Feature test macros understood by glibc |
| The paragraphs below explain how feature test macros are handled |
| in glibc 2.\fIx\fP, |
| .I x |
| > 0. |
| .PP |
| First, though, a summary of a few details for the impatient: |
| .IP * 3 |
| The macros that you most likely need to use in modern source code are |
| .BR _POSIX_C_SOURCE |
| (for definitions from various versions of POSIX.1), |
| .BR _XOPEN_SOURCE |
| (for definitions from various versions of SUS), |
| .BR _GNU_SOURCE |
| (for GNU and/or Linux specific stuff), and |
| .BR _DEFAULT_SOURCE |
| (to get definitions that would normally be provided by default). |
| .IP * |
| Certain macros are defined with default values. |
| Thus, although one or more macros may be indicated as being |
| required in the SYNOPSIS of a man page, |
| it may not be necessary to define them explicitly. |
| Full details of the defaults are given later in this man page. |
| .IP * |
| Defining |
| .BR _XOPEN_SOURCE |
| with a value of 600 or greater produces the same effects as defining |
| .BR _POSIX_C_SOURCE |
| with a value of 200112L or greater. |
| Where one sees |
| .IP |
| .in +4n |
| .EX |
| _POSIX_C_SOURCE >= 200112L |
| .EE |
| .in |
| .IP |
| in the feature test macro requirements in the SYNOPSIS of a man page, |
| it is implicit that the following has the same effect: |
| .IP |
| .in +4n |
| .EX |
| _XOPEN_SOURCE >= 600 |
| .EE |
| .in |
| .IP * |
| Defining |
| .BR _XOPEN_SOURCE |
| with a value of 700 or greater produces the same effects as defining |
| .BR _POSIX_C_SOURCE |
| with a value of 200809L or greater. |
| Where one sees |
| .IP |
| .in +4n |
| .EX |
| _POSIX_C_SOURCE >= 200809L |
| .EE |
| .in |
| .IP |
| in the feature test macro requirements in the SYNOPSIS of a man page, |
| it is implicit that the following has the same effect: |
| .IP |
| .in +4n |
| .EX |
| _XOPEN_SOURCE >= 700 |
| .EE |
| .in |
| .\" The details in glibc 2.0 are simpler, but combining a |
| .\" a description of them with the details in later glibc versions |
| .\" would make for a complicated description. |
| .PP |
| Glibc understands the following feature test macros: |
| .TP |
| .B __STRICT_ANSI__ |
| ISO Standard C. |
| This macro is implicitly defined by |
| .BR gcc (1) |
| when invoked with, for example, the |
| .I \-std=c99 |
| or |
| .I \-ansi |
| flag. |
| .TP |
| .B _POSIX_C_SOURCE |
| Defining this macro causes header files to expose definitions as follows: |
| .RS |
| .IP \(bu 3 |
| The value 1 exposes definitions conforming to POSIX.1-1990 and |
| ISO C (1990). |
| .IP \(bu |
| The value 2 or greater additionally exposes |
| definitions for POSIX.2-1992. |
| .IP \(bu |
| The value 199309L or greater additionally exposes |
| definitions for POSIX.1b (real-time extensions). |
| .\" 199506L functionality is available only since glibc 2.1 |
| .IP \(bu |
| The value 199506L or greater additionally exposes |
| definitions for POSIX.1c (threads). |
| .IP \(bu |
| (Since glibc 2.3.3) |
| The value 200112L or greater additionally exposes definitions corresponding |
| to the POSIX.1-2001 base specification (excluding the XSI extension). |
| This value also causes C95 (since glibc 2.12) and |
| C99 (since glibc 2.10) features to be exposed |
| (in other words, the equivalent of defining |
| .BR _ISOC99_SOURCE ). |
| .IP \(bu |
| (Since glibc 2.10) |
| The value 200809L or greater additionally exposes definitions corresponding |
| to the POSIX.1-2008 base specification (excluding the XSI extension). |
| .RE |
| .TP |
| .B _POSIX_SOURCE |
| Defining this obsolete macro with any value is equivalent to defining |
| .B _POSIX_C_SOURCE |
| with the value 1. |
| .IP |
| Since this macro is obsolete, |
| its usage is generally not documented when discussing |
| feature test macro requirements in the man pages. |
| .TP |
| .B _XOPEN_SOURCE |
| Defining this macro causes header files to expose definitions as follows: |
| .RS |
| .IP \(bu 3 |
| Defining with any value exposes |
| definitions conforming to POSIX.1, POSIX.2, and XPG4. |
| .IP \(bu |
| The value 500 or greater additionally exposes |
| definitions for SUSv2 (UNIX 98). |
| .IP \(bu |
| (Since glibc 2.2) The value 600 or greater additionally exposes |
| definitions for SUSv3 (UNIX 03; i.e., the POSIX.1-2001 base specification |
| plus the XSI extension) and C99 definitions. |
| .IP \(bu |
| (Since glibc 2.10) The value 700 or greater additionally exposes |
| definitions for SUSv4 (i.e., the POSIX.1-2008 base specification |
| plus the XSI extension). |
| .RE |
| .IP |
| If |
| .B __STRICT_ANSI__ |
| is not defined, or |
| .BR _XOPEN_SOURCE |
| is defined with a value greater than or equal to 500 |
| .I and |
| neither |
| .B _POSIX_SOURCE |
| nor |
| .B _POSIX_C_SOURCE |
| is explicitly defined, then |
| the following macros are implicitly defined: |
| .RS |
| .IP \(bu 3 |
| .B _POSIX_SOURCE |
| is defined with the value 1. |
| .IP \(bu |
| .B _POSIX_C_SOURCE |
| is defined, according to the value of |
| .BR _XOPEN_SOURCE : |
| .RS |
| .TP |
| .BR _XOPEN_SOURCE " < 500" |
| .B _POSIX_C_SOURCE |
| is defined with the value 2. |
| .TP |
| .RB "500 <= " _XOPEN_SOURCE " < 600" |
| .B _POSIX_C_SOURCE |
| is defined with the value 199506L. |
| .TP |
| .RB "600 <= " _XOPEN_SOURCE " < 700" |
| .B _POSIX_C_SOURCE |
| is defined with the value 200112L. |
| .TP |
| .RB "700 <= " _XOPEN_SOURCE " (since glibc 2.10)" |
| .B _POSIX_C_SOURCE |
| is defined with the value 200809L. |
| .RE |
| .RE |
| .IP |
| In addition, defining |
| .BR _XOPEN_SOURCE |
| with a value of 500 or greater produces the same effects as defining |
| .BR _XOPEN_SOURCE_EXTENDED . |
| .TP |
| .B _XOPEN_SOURCE_EXTENDED |
| If this macro is defined, |
| .I and |
| .B _XOPEN_SOURCE |
| is defined, then expose definitions corresponding to the XPG4v2 |
| (SUSv1) UNIX extensions (UNIX 95). |
| Defining |
| .B _XOPEN_SOURCE |
| with a value of 500 or more also produces the same effect as defining |
| .BR _XOPEN_SOURCE_EXTENDED . |
| Use of |
| .BR _XOPEN_SOURCE_EXTENDED |
| in new source code should be avoided. |
| .IP |
| Since defining |
| .B _XOPEN_SOURCE |
| with a value of 500 or more has the same effect as defining |
| .BR _XOPEN_SOURCE_EXTENDED , |
| the latter (obsolete) feature test macro is generally not described in the |
| SYNOPSIS in man pages. |
| .TP |
| .BR _ISOC99_SOURCE " (since glibc 2.1.3)" |
| Exposes declarations consistent with the ISO C99 standard. |
| .IP |
| Earlier glibc 2.1.x versions recognized an equivalent macro named |
| .B _ISOC9X_SOURCE |
| (because the C99 standard had not then been finalized). |
| Although the use of this macro is obsolete, glibc continues |
| to recognize it for backward compatibility. |
| .IP |
| Defining |
| .B _ISOC99_SOURCE |
| also exposes ISO C (1990) Amendment 1 ("C95") definitions. |
| (The primary change in C95 was support for international character sets.) |
| .IP |
| Invoking the C compiler with the option |
| .IR \-std=c99 |
| produces the same effects as defining this macro. |
| .TP |
| .BR _ISOC11_SOURCE " (since glibc 2.16)" |
| Exposes declarations consistent with the ISO C11 standard. |
| Defining this macro also enables C99 and C95 features (like |
| .BR _ISOC99_SOURCE ). |
| .IP |
| Invoking the C compiler with the option |
| .IR \-std=c11 |
| produces the same effects as defining this macro. |
| .TP |
| .B _LARGEFILE64_SOURCE |
| Expose definitions for the alternative API specified by the |
| LFS (Large File Summit) as a "transitional extension" to the |
| Single UNIX Specification. |
| (See |
| .UR http:\:/\:/opengroup.org\:/platform\:/lfs.html |
| .UE .) |
| The alternative API consists of a set of new objects |
| (i.e., functions and types) whose names are suffixed with "64" |
| (e.g., |
| .I off64_t |
| versus |
| .IR off_t , |
| .BR lseek64 () |
| versus |
| .BR lseek (), |
| etc.). |
| New programs should not employ this macro; instead |
| .I _FILE_OFFSET_BITS=64 |
| should be employed. |
| .TP |
| .BR _LARGEFILE_SOURCE |
| This macro was historically used to expose certain functions (specifically |
| .BR fseeko (3) |
| and |
| .BR ftello (3)) |
| that address limitations of earlier APIs |
| .RB ( fseek (3) |
| and |
| .BR ftell (3)) |
| that use |
| .IR "long" |
| for file offsets. |
| This macro is implicitly defined if |
| .BR _XOPEN_SOURCE |
| is defined with a value greater than or equal to 500. |
| New programs should not employ this macro; |
| defining |
| .BR _XOPEN_SOURCE |
| as just described or defining |
| .B _FILE_OFFSET_BITS |
| with the value 64 is the preferred mechanism to achieve the same result. |
| .TP |
| .B _FILE_OFFSET_BITS |
| Defining this macro with the value 64 |
| automatically converts references to 32-bit functions and data types |
| related to file I/O and filesystem operations into references to |
| their 64-bit counterparts. |
| This is useful for performing I/O on large files (> 2 Gigabytes) |
| on 32-bit systems. |
| (Defining this macro permits correctly written programs to use |
| large files with only a recompilation being required.) |
| .IP |
| 64-bit systems naturally permit file sizes greater than 2 Gigabytes, |
| and on those systems this macro has no effect. |
| .TP |
| .BR _BSD_SOURCE " (deprecated since glibc 2.20)" |
| Defining this macro with any value causes header files to expose |
| BSD-derived definitions. |
| .IP |
| In glibc versions up to and including 2.18, |
| defining this macro also causes BSD definitions to be preferred in |
| some situations where standards conflict, unless one or more of |
| .BR _SVID_SOURCE , |
| .BR _POSIX_SOURCE , |
| .BR _POSIX_C_SOURCE , |
| .BR _XOPEN_SOURCE , |
| .BR _XOPEN_SOURCE_EXTENDED , |
| or |
| .B _GNU_SOURCE |
| is defined, in which case BSD definitions are disfavored. |
| Since glibc 2.19, |
| .B _BSD_SOURCE |
| no longer causes BSD definitions to be preferred in case of conflicts. |
| .IP |
| Since glibc 2.20, this macro is deprecated. |
| .\" commit c941736c92fa3a319221f65f6755659b2a5e0a20 |
| .\" commit 498afc54dfee41d33ba519f496e96480badace8e |
| .\" commit acd7f096d79c181866d56d4aaf3b043e741f1e2c |
| It now has the same effect as defining |
| .BR _DEFAULT_SOURCE , |
| but generates a compile-time warning (unless |
| .BR _DEFAULT_SOURCE |
| .\" commit ade40b10ff5fa59a318cf55b9d8414b758e8df78 |
| is also defined). |
| Use |
| .B _DEFAULT_SOURCE |
| instead. |
| To allow code that requires |
| .BR _BSD_SOURCE |
| in glibc 2.19 and earlier and |
| .BR _DEFAULT_SOURCE |
| in glibc 2.20 and later to compile without warnings, define |
| .I both |
| .B _BSD_SOURCE |
| and |
| .BR _DEFAULT_SOURCE . |
| .TP |
| .BR _SVID_SOURCE " (deprecated since glibc 2.20)" |
| Defining this macro with any value causes header files to expose |
| System V-derived definitions. |
| (SVID == System V Interface Definition; see |
| .BR standards (7).) |
| .IP |
| Since glibc 2.20, this macro is deprecated in the same fashion as |
| .BR _BSD_SOURCE . |
| .TP |
| .BR _DEFAULT_SOURCE " (since glibc 2.19)" |
| This macro can be defined to ensure that the "default" |
| definitions are provided even when the defaults would otherwise |
| be disabled, |
| as happens when individual macros are explicitly defined, |
| or the compiler is invoked in one of its "standard" modes (e.g., |
| .IR "cc\ \-std=c99" ). |
| Defining |
| .B _DEFAULT_SOURCE |
| without defining other individual macros |
| or invoking the compiler in one of its "standard" modes has no effect. |
| .IP |
| The "default" definitions comprise those required by POSIX.1-2008 and ISO C99, |
| as well as various definitions originally derived from BSD and System V. |
| On glibc 2.19 and earlier, these defaults were approximately equivalent |
| to explicitly defining the following: |
| .IP |
| cc \-D_BSD_SOURCE \-D_SVID_SOURCE \-D_POSIX_C_SOURCE=200809 |
| .TP |
| .BR _ATFILE_SOURCE " (since glibc 2.4)" |
| Defining this macro with any value causes header files to expose |
| declarations of a range of functions with the suffix "at"; |
| see |
| .BR openat (2). |
| Since glibc 2.10, this macro is also implicitly defined if |
| .BR _POSIX_C_SOURCE |
| is defined with a value greater than or equal to 200809L. |
| .TP |
| .B _GNU_SOURCE |
| Defining this macro (with any value) implicitly defines |
| .BR _ATFILE_SOURCE , |
| .BR _LARGEFILE64_SOURCE , |
| .BR _ISOC99_SOURCE , |
| .BR _XOPEN_SOURCE_EXTENDED , |
| .BR _POSIX_SOURCE , |
| .B _POSIX_C_SOURCE |
| with the value 200809L |
| (200112L in glibc versions before 2.10; |
| 199506L in glibc versions before 2.5; |
| 199309L in glibc versions before 2.1) |
| and |
| .B _XOPEN_SOURCE |
| with the value 700 |
| (600 in glibc versions before 2.10; |
| 500 in glibc versions before 2.2). |
| In addition, various GNU-specific extensions are also exposed. |
| .IP |
| Since glibc 2.19, defining |
| .BR _GNU_SOURCE |
| also has the effect of implicitly defining |
| .BR _DEFAULT_SOURCE . |
| In glibc versions before 2.20, defining |
| .BR _GNU_SOURCE |
| also had the effect of implicitly defining |
| .BR _BSD_SOURCE |
| and |
| .BR _SVID_SOURCE . |
| .TP |
| .B _REENTRANT |
| Historically, on various C libraries |
| it was necessary to define this macro in all |
| multithreaded code. |
| .\" Zack Weinberg |
| .\" There did once exist C libraries where it was necessary. The ones |
| .\" I remember were proprietary Unix vendor libcs from the mid-1990s |
| .\" You would get completely unlocked stdio without _REENTRANT. |
| (Some C libraries may still require this.) |
| In glibc, |
| this macro also exposed definitions of certain reentrant functions. |
| .IP |
| However, glibc has been thread-safe by default for many years; |
| since glibc 2.3, the only effect of defining |
| .BR _REENTRANT |
| has been to enable one or two of the same declarations that |
| are also enabled by defining |
| .BR _POSIX_C_SOURCE |
| with a value of 199606L or greater. |
| .IP |
| .B _REENTRANT |
| is now obsolete. |
| In glibc 2.25 and later, defining |
| .B _REENTRANT |
| is equivalent to defining |
| .B _POSIX_C_SOURCE |
| with the value 199606L. |
| If a higher POSIX conformance level is |
| selected by any other means (such as |
| .B _POSIX_C_SOURCE |
| itself, |
| .BR _XOPEN_SOURCE , |
| .BR _DEFAULT_SOURCE , |
| or |
| .BR _GNU_SOURCE ), |
| then defining |
| .B _REENTRANT |
| has no effect. |
| .IP |
| This macro is automatically defined if one compiles with |
| .IR "cc\ \-pthread" . |
| .TP |
| .B _THREAD_SAFE |
| Synonym for the (deprecated) |
| .BR _REENTRANT , |
| provided for compatibility with some other implementations. |
| .TP |
| .BR _FORTIFY_SOURCE " (since glibc 2.3.4)" |
| .\" For more detail, see: |
| .\" http://gcc.gnu.org/ml/gcc-patches/2004-09/msg02055.html |
| .\" [PATCH] Object size checking to prevent (some) buffer overflows |
| .\" * From: Jakub Jelinek <jakub at redhat dot com> |
| .\" * To: gcc-patches at gcc dot gnu dot org |
| .\" * Date: Tue, 21 Sep 2004 04:16:40 -0400 |
| Defining this macro causes some lightweight checks to be performed |
| to detect some buffer overflow errors when employing |
| various string and memory manipulation functions (for example, |
| .BR memcpy (3), |
| .BR memset (3), |
| .BR stpcpy (3), |
| .BR strcpy (3), |
| .BR strncpy (3), |
| .BR strcat (3), |
| .BR strncat (3), |
| .BR sprintf (3), |
| .BR snprintf (3), |
| .BR vsprintf (3), |
| .BR vsnprintf (3), |
| .BR gets (3), |
| and wide character variants thereof). |
| For some functions, argument consistency is checked; |
| for example, a check is made that |
| .BR open (2) |
| has been supplied with a |
| .I mode |
| argument when the specified flags include |
| .BR O_CREAT . |
| Not all problems are detected, just some common cases. |
| .\" Look for __USE_FORTIFY_LEVEL in the header files |
| .IP |
| If |
| .B _FORTIFY_SOURCE |
| is set to 1, with compiler optimization level 1 |
| .RI ( "gcc\ \-O1" ) |
| and above, checks that shouldn't change the behavior of |
| conforming programs are performed. |
| With |
| .B _FORTIFY_SOURCE |
| set to 2, some more checking is added, but |
| some conforming programs might fail. |
| .\" For example, given the following code |
| .\" int d; |
| .\" char buf[1000], buf[1000]; |
| .\" strcpy(fmt, "Hello world\n%n"); |
| .\" snprintf(buf, sizeof(buf), fmt, &d); |
| .\" |
| .\" Compiling with "gcc -D_FORTIFY_SOURCE=2 -O1" and then running will |
| .\" cause the following diagnostic at run time at the snprintf() call |
| .\" |
| .\" *** %n in writable segment detected *** |
| .\" Aborted (core dumped) |
| .\" |
| .IP |
| Some of the checks can be performed at compile time |
| (via macros logic implemented in header files), |
| and result in compiler warnings; |
| other checks take place at run time, |
| and result in a run-time error if the check fails. |
| .IP |
| Use of this macro requires compiler support, available with |
| .BR gcc (1) |
| since version 4.0. |
| .SS Default definitions, implicit definitions, and combining definitions |
| If no feature test macros are explicitly defined, |
| then the following feature test macros are defined by default: |
| .BR _BSD_SOURCE |
| (in glibc 2.19 and earlier), |
| .BR _SVID_SOURCE |
| (in glibc 2.19 and earlier), |
| .BR _DEFAULT_SOURCE |
| (since glibc 2.19), |
| .BR _POSIX_SOURCE , |
| and |
| .BR _POSIX_C_SOURCE =200809L |
| (200112L in glibc versions before 2.10; |
| 199506L in glibc versions before 2.4; |
| 199309L in glibc versions before 2.1). |
| .PP |
| If any of |
| .BR __STRICT_ANSI__ , |
| .BR _ISOC99_SOURCE , |
| .BR _ISOC11_SOURCE |
| (since glibc 2.18), |
| .BR _POSIX_SOURCE , |
| .BR _POSIX_C_SOURCE , |
| .BR _XOPEN_SOURCE , |
| .BR _XOPEN_SOURCE_EXTENDED |
| (in glibc 2.11 and earlier), |
| .BR _BSD_SOURCE |
| (in glibc 2.19 and earlier), |
| or |
| .B _SVID_SOURCE |
| (in glibc 2.19 and earlier) |
| is explicitly defined, then |
| .BR _BSD_SOURCE , |
| .BR _SVID_SOURCE , |
| and |
| .BR _DEFAULT_SOURCE |
| are not defined by default. |
| .PP |
| If |
| .B _POSIX_SOURCE |
| and |
| .B _POSIX_C_SOURCE |
| are not explicitly defined, |
| and either |
| .B __STRICT_ANSI__ |
| is not defined or |
| .B _XOPEN_SOURCE |
| is defined with a value of 500 or more, then |
| .IP * 3 |
| .B _POSIX_SOURCE |
| is defined with the value 1; and |
| .IP * |
| .B _POSIX_C_SOURCE |
| is defined with one of the following values: |
| .RS 3 |
| .IP \(bu 3 |
| 2, |
| if |
| .B _XOPEN_SOURCE |
| is defined with a value less than 500; |
| .IP \(bu |
| 199506L, |
| if |
| .B _XOPEN_SOURCE |
| is defined with a value greater than or equal to 500 and less than 600; |
| or |
| .IP \(bu |
| (since glibc 2.4) 200112L, |
| if |
| .B _XOPEN_SOURCE |
| is defined with a value greater than or equal to 600 and less than 700. |
| .IP \(bu |
| (Since glibc 2.10) |
| 200809L, |
| if |
| .B _XOPEN_SOURCE |
| is defined with a value greater than or equal to 700. |
| .IP \(bu |
| Older versions of glibc do not know about the values |
| 200112L and 200809L for |
| .BR _POSIX_C_SOURCE , |
| and the setting of this macro will depend on the glibc version. |
| .IP \(bu |
| If |
| .B _XOPEN_SOURCE |
| is undefined, then the setting of |
| .B _POSIX_C_SOURCE |
| depends on the glibc version: |
| 199506L, in glibc versions before 2.4; |
| 200112L, in glibc 2.4 to 2.9; and |
| 200809L, since glibc 2.10. |
| .RE |
| .PP |
| Multiple macros can be defined; the results are additive. |
| .SH CONFORMING TO |
| POSIX.1 specifies |
| .BR _POSIX_C_SOURCE , |
| .BR _POSIX_SOURCE , |
| and |
| .BR _XOPEN_SOURCE . |
| .PP |
| .B _XOPEN_SOURCE_EXTENDED |
| was specified by XPG4v2 (aka SUSv1), but is not present in SUSv2 and later. |
| .B _FILE_OFFSET_BITS |
| is not specified by any standard, |
| but is employed on some other implementations. |
| .PP |
| .BR _BSD_SOURCE , |
| .BR _SVID_SOURCE , |
| .BR _DEFAULT_SOURCE , |
| .BR _ATFILE_SOURCE , |
| .BR _GNU_SOURCE , |
| .BR _FORTIFY_SOURCE , |
| .BR _REENTRANT , |
| and |
| .B _THREAD_SAFE |
| are specific to Linux (glibc). |
| .SH NOTES |
| .I <features.h> |
| is a Linux/glibc-specific header file. |
| Other systems have an analogous file, but typically with a different name. |
| This header file is automatically included by other header files as |
| required: it is not necessary to explicitly include it in order to |
| employ feature test macros. |
| .PP |
| According to which of the above feature test macros are defined, |
| .I <features.h> |
| internally defines various other macros that are checked by |
| other glibc header files. |
| These macros have names prefixed by two underscores (e.g., |
| .BR __USE_MISC ). |
| Programs should |
| .I never |
| define these macros directly: |
| instead, the appropriate feature test macro(s) from the |
| list above should be employed. |
| .SH EXAMPLES |
| The program below can be used to explore how the various |
| feature test macros are set depending on the glibc version |
| and what feature test macros are explicitly set. |
| The following shell session, on a system with glibc 2.10, |
| shows some examples of what we would see: |
| .PP |
| .in +4n |
| .EX |
| $ \fBcc ftm.c\fP |
| $ \fB./a.out\fP |
| _POSIX_SOURCE defined |
| _POSIX_C_SOURCE defined: 200809L |
| _BSD_SOURCE defined |
| _SVID_SOURCE defined |
| _ATFILE_SOURCE defined |
| $ \fBcc \-D_XOPEN_SOURCE=500 ftm.c\fP |
| $ \fB./a.out\fP |
| _POSIX_SOURCE defined |
| _POSIX_C_SOURCE defined: 199506L |
| _XOPEN_SOURCE defined: 500 |
| $ \fBcc \-D_GNU_SOURCE ftm.c\fP |
| $ \fB./a.out\fP |
| _POSIX_SOURCE defined |
| _POSIX_C_SOURCE defined: 200809L |
| _ISOC99_SOURCE defined |
| _XOPEN_SOURCE defined: 700 |
| _XOPEN_SOURCE_EXTENDED defined |
| _LARGEFILE64_SOURCE defined |
| _BSD_SOURCE defined |
| _SVID_SOURCE defined |
| _ATFILE_SOURCE defined |
| _GNU_SOURCE defined |
| .EE |
| .in |
| .SS Program source |
| \& |
| .EX |
| /* ftm.c */ |
| |
| #include <stdint.h> |
| #include <stdio.h> |
| #include <unistd.h> |
| #include <stdlib.h> |
| |
| int |
| main(int argc, char *argv[]) |
| { |
| #ifdef _POSIX_SOURCE |
| printf("_POSIX_SOURCE defined\en"); |
| #endif |
| |
| #ifdef _POSIX_C_SOURCE |
| printf("_POSIX_C_SOURCE defined: %jdL\en", |
| (intmax_t) _POSIX_C_SOURCE); |
| #endif |
| |
| #ifdef _ISOC99_SOURCE |
| printf("_ISOC99_SOURCE defined\en"); |
| #endif |
| |
| #ifdef _ISOC11_SOURCE |
| printf("_ISOC11_SOURCE defined\en"); |
| #endif |
| |
| #ifdef _XOPEN_SOURCE |
| printf("_XOPEN_SOURCE defined: %d\en", _XOPEN_SOURCE); |
| #endif |
| |
| #ifdef _XOPEN_SOURCE_EXTENDED |
| printf("_XOPEN_SOURCE_EXTENDED defined\en"); |
| #endif |
| |
| #ifdef _LARGEFILE64_SOURCE |
| printf("_LARGEFILE64_SOURCE defined\en"); |
| #endif |
| |
| #ifdef _FILE_OFFSET_BITS |
| printf("_FILE_OFFSET_BITS defined: %d\en", _FILE_OFFSET_BITS); |
| #endif |
| |
| #ifdef _BSD_SOURCE |
| printf("_BSD_SOURCE defined\en"); |
| #endif |
| |
| #ifdef _SVID_SOURCE |
| printf("_SVID_SOURCE defined\en"); |
| #endif |
| |
| #ifdef _DEFAULT_SOURCE |
| printf("_DEFAULT_SOURCE defined\en"); |
| #endif |
| |
| #ifdef _ATFILE_SOURCE |
| printf("_ATFILE_SOURCE defined\en"); |
| #endif |
| |
| #ifdef _GNU_SOURCE |
| printf("_GNU_SOURCE defined\en"); |
| #endif |
| |
| #ifdef _REENTRANT |
| printf("_REENTRANT defined\en"); |
| #endif |
| |
| #ifdef _THREAD_SAFE |
| printf("_THREAD_SAFE defined\en"); |
| #endif |
| |
| #ifdef _FORTIFY_SOURCE |
| printf("_FORTIFY_SOURCE defined\en"); |
| #endif |
| |
| exit(EXIT_SUCCESS); |
| } |
| .EE |
| .SH SEE ALSO |
| .BR libc (7), |
| .BR standards (7), |
| .BR system_data_types (7) |
| .PP |
| The section "Feature Test Macros" under |
| .IR "info libc" . |
| .\" But beware: the info libc document is out of date (Jul 07, mtk) |
| .PP |
| .I /usr/include/features.h |