Kodama's home / tips.

How to inspect C macro defs and specify OS/MPU

Request for reportings

If your OS is not available in examples, please mail me(kodama@math.kobe-u.ac.jp) your OS/MPU and result of the following:
$ echo | gcc -v -E -dM -
....results

How to inspect C macro defs

Use "-v -E -dM" option with GCC.

Example:

$ gcc -v -E -dM sample.c
Reading specs from /usr/lib/gcc-lib/i386-pc-linux/2.95.3/specs
gcc version 2.95.3 20010315 (release)
 /usr/lib/gcc-lib/i386-pc-linux/2.95.3/cpp0 -lang-c -v -D__GNUC__=2 -D__GNUC_MINOR__=95 -D__ELF__
.....snip.....
#define __FD_SETSIZE 1024 
#define __flexarr [0] 
#define _IO_IS_APPENDING 0x1000 
Or "echo | gcc -v -E -dM -" for default defs.

Example: GCC-3.4.1/Linux/i386

$ echo | gcc -v -E -dM -
Reading specs from /usr/lib/gcc/i686-pc-linux-gnu/3.4.1/specs
Configured with: ./configure --with-gnu-as --with-gnu-ld --prefix=/usr
Thread model: posix
gcc version 3.4.1
 /usr/libexec/gcc/i686-pc-linux-gnu/3.4.1/cc1 -E -quiet -v - -mtune=pentiumpro -dM
ignoring nonexistent directory "/usr/lib/gcc/i686-pc-linux-gnu/3.4.1/../../../../i686-pc-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/local/include
 /usr/lib/gcc/i686-pc-linux-gnu/3.4.1/include
 /usr/include
End of search list.
#define __DBL_MIN_EXP__ (-1021)
#define __FLT_MIN__ 1.17549435e-38F
#define __CHAR_BIT__ 8
#define __WCHAR_MAX__ 2147483647
#define __DBL_DENORM_MIN__ 4.9406564584124654e-324
#define __FLT_EVAL_METHOD__ 2
#define __DBL_MIN_10_EXP__ (-307)
#define __FINITE_MATH_ONLY__ 0
#define __GNUC_PATCHLEVEL__ 1
#define __SHRT_MAX__ 32767
#define __LDBL_MAX__ 1.18973149535723176502e+4932L
#define __linux 1
#define __unix 1
#define __LDBL_MAX_EXP__ 16384
#define __linux__ 1
#define __SCHAR_MAX__ 127
#define __USER_LABEL_PREFIX__ 
#define __STDC_HOSTED__ 1
#define __LDBL_HAS_INFINITY__ 1
#define __DBL_DIG__ 15
#define __FLT_EPSILON__ 1.19209290e-7F
#define __tune_i686__ 1
#define __LDBL_MIN__ 3.36210314311209350626e-4932L
#define __unix__ 1
#define __DECIMAL_DIG__ 21
#define __gnu_linux__ 1
#define __LDBL_HAS_QUIET_NAN__ 1
#define __GNUC__ 3
#define __DBL_MAX__ 1.7976931348623157e+308
#define __DBL_HAS_INFINITY__ 1
#define __DBL_MAX_EXP__ 1024
#define __LONG_LONG_MAX__ 9223372036854775807LL
#define __GXX_ABI_VERSION 1002
#define __FLT_MIN_EXP__ (-125)
#define __DBL_MIN__ 2.2250738585072014e-308
#define __DBL_HAS_QUIET_NAN__ 1
#define __REGISTER_PREFIX__ 
#define __NO_INLINE__ 1
#define __i386 1
#define __FLT_MANT_DIG__ 24
#define __VERSION__ "3.4.1"
#define i386 1
#define unix 1
#define __i386__ 1
#define __SIZE_TYPE__ unsigned int
#define __ELF__ 1
#define __FLT_RADIX__ 2
#define __LDBL_EPSILON__ 1.08420217248550443401e-19L
#define __FLT_HAS_QUIET_NAN__ 1
#define __FLT_MAX_10_EXP__ 38
#define __LONG_MAX__ 2147483647L
#define __FLT_HAS_INFINITY__ 1
#define linux 1
#define __LDBL_MANT_DIG__ 64
#define __WCHAR_TYPE__ long int
#define __FLT_DIG__ 6
#define __INT_MAX__ 2147483647
#define __FLT_MAX_EXP__ 128
#define __DBL_MANT_DIG__ 53
#define __WINT_TYPE__ unsigned int
#define __LDBL_MIN_EXP__ (-16381)
#define __LDBL_MAX_10_EXP__ 4932
#define __DBL_EPSILON__ 2.2204460492503131e-16
#define __tune_pentiumpro__ 1
#define __FLT_DENORM_MIN__ 1.40129846e-45F
#define __FLT_MAX__ 3.40282347e+38F
#define __FLT_MIN_10_EXP__ (-37)
#define __GNUC_MINOR__ 4
#define __DBL_MAX_10_EXP__ 308
#define __LDBL_DENORM_MIN__ 3.64519953188247460253e-4951L
#define __PTRDIFF_TYPE__ int
#define __LDBL_MIN_10_EXP__ (-4931)
#define __LDBL_DIG__ 18

Example: GCC-2.95.3/Linux/i386

Note. Recomended "#if define(__linux__)" to specify the system, not "linux" but "__linux__".
$ echo | gcc -v -E -dM -
Reading specs from /usr/lib/gcc-lib/i386-pc-linux/2.95.3/specs
gcc version 2.95.3 20010315 (release)
 /usr/lib/gcc-lib/i386-pc-linux/2.95.3/cpp0 -lang-c -v -D__GNUC__=2 -D__GNUC_MINOR__=95
     -D__ELF__ -Dunix -D__i386__ -Dlinux -D__ELF__ -D__unix__ -D__i386__ -D__linux__ -D__unix
     -D__linux -Asystem(posix) -dM -Acpu(i386) -Amachine(i386) -Di386 -D__i386 -D__i386__ -
GNU CPP version 2.95.3 20010315 (release) (i386 Linux/ELF)
#include "..." search starts here:
#include <...> search starts here:
 /usr/include
 /usr/lib/gcc-lib/i386-pc-linux/2.95.3/../../../../i386-pc-linux/include
 /usr/lib/gcc-lib/i386-pc-linux/2.95.3/include
 /usr/include
End of search list.
The following default directories have been omitted from the search path:
 /usr/lib/gcc-lib/i386-pc-linux/2.95.3/../../../../include/g++-3
End of omitted list.
#define __linux__ 1 
#define linux 1 
#define __i386__ 1 
#define __i386 1 
#define __GNUC_MINOR__ 95 
#define i386 1 
#define __unix 1 
#define __unix__ 1 
#define __GNUC__ 2 
#define __linux 1 
#define __ELF__ 1 
#define unix 1 
(K.Kodama 2004)

Example: GCC-3.3.1/Cygwin WindowsXP/i686

Note. Recomended "#if define(__CYGWIN__)" to specify the system.
$ echo | gcc -v -E -dM -
Reading specs from /usr/lib/gcc-lib/i686-pc-cygwin/3.3.1/specs
Configured with: /GCC/gcc-3.3.1-3/configure --with-gcc --with-gnu-ld --with-gnu-as --prefix=/usr
    --exec-prefix=/usr --sysconfdir=/etc --libdir=/usr/lib --libexecdir=/usr/sbin --mandir=/usr/share/man
    --infodir=/usr/share/info --enable-languages=c,ada,c++,f77,pascal,java,objc --enable-libgcj
    --enable-threads=posix --with-system-zlib --enable-nls --without-included-gettext --enable-interpreter
    --enable-sjlj-exceptions --disable-version-specific-runtime-libs --enable-shared --disable-win32-registry
    --enable-java-gc=boehm --disable-hash-synchronization --verbose --target=i686-pc-cygwin
    --host=i686-pc-cygwin --build=i686-pc-cygwinThread model: posix
gcc version 3.3.1 (cygming special)
 /usr/lib/gcc-lib/i686-pc-cygwin/3.3.1/cc1.exe -E -quiet -v -D__GNUC__=3 -D__GNUC_MINOR__=3
    -D__GNUC_PATCHLEVEL__=1 -D__CYGWIN32__ -D__CYGWIN__ -Dunix -D__unix__ -D__unix
    -idirafter /usr/lib/gcc-lib/i686-pc-cygwin/3.3.1/../../../../include/w32api
    -idirafter /usr/lib/gcc-lib/i686-pc-cygwin/3.3.1/../../../../i686-pc-cygwin/lib/../../include/w32api - -dM
ignoring nonexistent directory "/usr/i686-pc-cygwin/include"
ignoring duplicate directory "/usr/i686-pc-cygwin/lib/../../include/w32api"
#include "..." search starts here:
#include <...> search starts here:
 /usr/local/include
 /usr/lib/gcc-lib/i686-pc-cygwin/3.3.1/include
 /usr/include
 /usr/include/w32api
End of search list.
#define __DBL_MIN_EXP__ (-1021)
#define __FLT_MIN__ 1.17549435e-38F
#define _X86_ 1
#define __CHAR_BIT__ 8
#define __WCHAR_MAX__ 65535U
#define __DBL_DENORM_MIN__ 4.9406564584124654e-324
#define __FLT_EVAL_METHOD__ 2
#define __unix__ 1
#define unix 1
#define __i386__ 1
#define __SIZE_TYPE__ unsigned int
#define __DBL_MIN_10_EXP__ (-307)
#define __FINITE_MATH_ONLY__ 0
#define __GNUC_PATCHLEVEL__ 1
#define __FLT_RADIX__ 2
#define __LDBL_EPSILON__ 1.08420217248550443401e-19L
#define _stdcall __attribute__((__stdcall__))
#define __SHRT_MAX__ 32767
#define __LDBL_MAX__ 1.18973149535723176502e+4932L
#define __CYGWIN__ 1
#define __unix 1
#define __LDBL_MAX_EXP__ 16384
#define __LONG_MAX__ 2147483647L
#define __SCHAR_MAX__ 127
#define __DBL_DIG__ 15
#define __USER_LABEL_PREFIX__ _
#define __STDC_HOSTED__ 1
#define __stdcall __attribute__((__stdcall__))
#define __LDBL_MANT_DIG__ 64
#define __FLT_EPSILON__ 1.19209290e-7F
#define __tune_i686__ 1
#define __LDBL_MIN__ 3.36210314311209350626e-4932L
#define __WCHAR_TYPE__ short unsigned int
#define __FLT_DIG__ 6
#define __FLT_MAX_10_EXP__ 38
#define __INT_MAX__ 2147483647
#define __FLT_MAX_EXP__ 128
#define __DECIMAL_DIG__ 21
#define __DBL_MANT_DIG__ 53
#define __WINT_TYPE__ unsigned int
#define __GNUC__ 3
#define _cdecl __attribute__((__cdecl__))
#define __LDBL_MIN_EXP__ (-16381)
#define __LDBL_MAX_10_EXP__ 4932
#define __DBL_EPSILON__ 2.2204460492503131e-16
#define __DBL_MAX__ 1.7976931348623157e+308
#define __tune_pentiumpro__ 1
#define __fastcall __attribute__((__fastcall__))
#define _fastcall __attribute__((__fastcall__))
#define __CYGWIN32__ 1
#define __USING_SJLJ_EXCEPTIONS__ 1
#define __DBL_MAX_EXP__ 1024
#define __FLT_DENORM_MIN__ 1.40129846e-45F
#define __LONG_LONG_MAX__ 9223372036854775807LL
#define __FLT_MAX__ 3.40282347e+38F
#define __GXX_ABI_VERSION 102
#define __FLT_MIN_10_EXP__ (-37)
#define __FLT_MIN_EXP__ (-125)
#define i386 1
#define __GNUC_MINOR__ 3
#define __DBL_MAX_10_EXP__ 308
#define __LDBL_DENORM_MIN__ 3.64519953188247460253e-4951L
#define __DBL_MIN__ 2.2250738585072014e-308
#define __PTRDIFF_TYPE__ int
#define __LDBL_MIN_10_EXP__ (-4931)
#define __REGISTER_PREFIX__
#define __cdecl __attribute__((__cdecl__))
#define __LDBL_DIG__ 18
#define __NO_INLINE__ 1
#define __i386 1
#define __FLT_MANT_DIG__ 24
#define __VERSION__ "3.3.1 (cygming special)"
#define __declspec(x) __attribute__((x))
(report by Toshio Sumi 2004)

Example: GCC-3.1/MacOSX/PowerPC

Note. Recomended "#if define(__APPLE__) && define(__POWERPC__)" to specify the system. Not "__POWERPC__" because of WindowsNT for PowerPC.
[Macintosh:~/work] admin% echo | gcc -v -E -dM - 
Reading specs from /usr/libexec/gcc/darwin/ppc/3.1/specs
Thread model: posix
Apple Computer, Inc. GCC version 1175, based on gcc version 3.1 20020420 (prerelease)
 /usr/libexec/gcc/darwin/ppc/3.1/cpp0 -lang-c -v -D__GNUC__=3 -D__GNUC_MINOR__=1 -D__GNUC_PATCHLEVEL__=0
    -D__APPLE_CC__=1175 -D__ppc__ -D__POWERPC__ -D__NATURAL_ALIGNMENT__ -D__MACH__ -D__BIG_ENDIAN__
    -D__APPLE__ -D__ppc__ -D__POWERPC__ -D__NATURAL_ALIGNMENT__ -D__MACH__ -D__BIG_ENDIAN__ -D__APPLE__
    -D__NO_INLINE__ -D__STDC_HOSTED__=1 -D__DYNAMIC__ - -dM
GNU CPP version 3.1 20020420 (prerelease) (cpplib) (Darwin/PowerPC)
ignoring nonexistent directory "/usr/lib/gcc-lib/ppc-darwin/3.1/../../../../ppc-darwin/include"
ignoring nonexistent directory "/Local/Library/Frameworks"
#include "..." search starts here:
#include <...> search starts here:
 /usr/local/include
 /usr/include/gcc/darwin/3.1
 /usr/include
End of search list.
Framework search starts here:
 /System/Library/Frameworks
 /Library/Frameworks
End of framework search list.
#define __BIG_ENDIAN__ 1
#define __HAVE_BUILTIN_SETJMP__ 1
#define __SIZE_TYPE__ long unsigned int
#define __GNUC_PATCHLEVEL__ 0
#define __NATURAL_ALIGNMENT__ 1
#define __APPLE_CC__ 1175
#define __USER_LABEL_PREFIX__ 
#define __STDC_HOSTED__ 1
#define __DYNAMIC__ 1
#define __WCHAR_TYPE__ int
#define __ppc__ 1
#define __APPLE__ 1
#define __MACH__ 1
#define __WINT_TYPE__ unsigned int
#define __GNUC__ 3
#define __GNUC_MINOR__ 1
#define __STDC__ 1
#define __PTRDIFF_TYPE__ int
#define __REGISTER_PREFIX__ 
#define __POWERPC__ 1
#define __NO_INLINE__ 1
#define __VERSION__ "3.1 20020420 (prerelease)"
(report by Toshio Sumi 2004)

Followings are Japanese explanations.

C のマクロを表示する方法と, いくつかの OS についての判別法をまとめました. 可搬性のある C のコードを書こうとするのは困難です. このページは, 最低限のコンパイル環境/動作環境の判別に使える事を目指しています.

OS の問題もありますが, GCC の版によるちがいが意外に大きいようですね.


Kodama's home / tips.