IFDEF(1) IFDEF(1)
NAME
ifdef - #ifdef/#else/#endif symbolic resolver
DESCRIPTION
"ifdef" selectively resolves #ifdef,#ifndef,#if,#elif,
#else and #endif in C/C++ source code. Macros that are
explicitly defined/undefined by -D/-U option are resolved
and eliminated from the source code. Other #ifdefs remain
unchanged. #if statements with multiple conditions and
&&,|| operators will be resolved by a symbolic resolver.
"ifdef" can be also used as a #ifdef nesting hierarchy
analyzer.
SYNOPSIS
ifdef <-dgmqrsuvV> <-f[deffile]> <-o[outfile]>
<-D[defined]<=[value]>> <-U[undefined]> <-o[outfile]> [source.c]
Option:
[options]
-D [macro]<=[value]>:resolve '#ifdef [macro]' as true
-U [macro] :resolve '#ifdef [macro]' as false
-f [deffile] :define/undef macros by file
#define [macro]<=[value]>
#undef [macro]
-o [outfile] :specify output file (default - stdout)
-m :no output
debug . . . . . . . . . . . . . . . . . . . . . . . . .
-q :quiet mode
-g :preview all #ifdef (no output)
-G :preview resolved #ifdef (no output)
-d :display deleted lines
-r :display resolved conditions
-u :display unresolved conditions
EXAMPLE
$ ifdef -D ONLINE -D MAX=1024 -U DEBUG -o newsource.c source.c
$ ifdef -g source.c
$ ifdef -G -d -DDEBUG1 source.c
EXAMPLE1 - #ifdef/#endif analyzer
"ifdef" can be used as a #ifdef analyzer by using -g
option. Location and nesting hierarchy of all the #if,
#ifdef,#ifndef,#elif,#endif statements will be displayed.
For example, let's analyze #ifdef structure in
$CINTSYSDIR/G__ci.h.
$ cd $CINTSYSDIR
$ ifdef -g G__ci.h
21: #ifndef G__CI_H unresolved
54: | #ifndef G__CONSTNESSFLAG unresolved
58: | #endif unresolved
89: | #ifdef G__OLDIMPLEMENTATION1073 unresolved
91: | #endif unresolved
114: | #ifndef G__OLDIMPLEMENTATION1231 unresolved
120: | | #ifdef G__CPPIF_EXTERNC unresolved
121: | | | #ifndef G__CPPIF_PROJNAME unresolved
123: | | | #endif unresolved
124: | | | #ifdef G__CPPIF_STATIC unresolved
126: | | | #endif unresolved
127: | | #endif unresolved
129: | | #ifndef G__CPPIF_PROJNAME unresolved
130: | | | #ifndef G__CPPIF_STATIC unresolved
132: | | | #endif unresolved
133: | | #endif unresolved
135: | #endif unresolved
142: | #if (!defined(__MAKECINT__)) || defined(G__API) 0,4 unresolved
145: | | #ifdef __cplusplus unresolved
146: | | | #ifndef G__ANSIHEADER unresolved
.
.
EXAMPLE2 - #ifdef/#endif partial symbolic resolution
The most powerful feature of "ifdef" is that it resolves
selected macro in order to simplify C/C++ source code. For
example, we have following source.
/* source.c /////////////////////////////// */
#ifdef A
int f() { return A; }
#else
unsigned int f() { return 0; }
#endif
#ifdef B
int g() { return B; }
#else
unsigned int g() { return 0; }
#endif
#if defined(A) && defined(B)
int x;
#endif
#if !defined(A) || defined(B)
int y;
#endif
/* end source.c /////////////////////////// */
Suppose macro A is always defined, so we want to eliminate
'#ifdef A' from the source. Use '-DA' option to specify that
we want to eliminate '#ifdef A'. Note that complex conditions,
such as '!defined(A) || defined(B)' , are partially resolved.
Also note that if A is referred as a value, it remains unchanged
for readability.
$ ifdef -DA source.c > tmp
$ cat tmp
/* source.c /////////////////////////////// */
int f() { return A; }
#ifdef B
int g() { return B; }
#else
unsigned int g() { return 0; }
#endif
#if defined(B)
int x;
#endif
#if defined(B)
int y;
#endif
/* end source.c /////////////////////////// */
Now, suppose macro A is always undefined, so we want to eliminate
'#ifdef A' in the other way. Use '-UA' option in this case.
$ ifdef -UA source.c > tmp
$ cat tmp
/* source.c /////////////////////////////// */
unsigned int f() { return 0; }
#ifdef B
int g() { return B; }
#else
unsigned int g() { return 0; }
#endif
int y;
/* end source.c /////////////////////////// */
You can define multiple -D, -U options. If you have many such
definitions, you can specify them in a file. Prepare a file
like below.
// macros.def - define/undef definition file
#define A
#undef B
#define C
#define D
Then, give this file by -f option.
$ ifdef -f macros.def source.c > tmp
EXAMPLE3 - #ifdef/#endif partial symbolic resolution preview
You may want to make sure #ifdefs are resolved correctly.
-G option will give you detailed information about which
macros and resolved. If you add -d option, eliminated lines
are also displayed.
$ ifdef -G -d -UA source.c
#undef A
2: #ifdef A ALWAYS FALSE
D 3: int f() { return A; }
4: #else ALWAYS TRUE
6: #endif END ALWAYS
14: #if defined(A) && defined(B) -> 0 ALWAYS FALSE
D 15: int x;
16: #endif END ALWAYS
18: #if !defined(A) || defined(B) -> 1 ALWAYS TRUE
20: #endif END ALWAYS
COMMENT
Although included in CINT package, ifdef is an independent
software productivity tool.
AUTHOR
Masaharu Goto (cint@pcroot.cern.ch)
Copyright (c) 1994~2001 Masaharu Goto