Follow Techotopia on Twitter

On-line Guides
All Guides
eBook Store
iOS / Android
Linux for Beginners
Office Productivity
Linux Installation
Linux Security
Linux Utilities
Linux Virtualization
Linux Kernel
System/Network Admin
Programming
Scripting Languages
Development Tools
Web Development
GUI Toolkits/Desktop
Databases
Mail Systems
openSolaris
Eclipse Documentation
Techotopia.com
Virtuatopia.com

How To Guides
Virtualization
General System Admin
Linux Security
Linux Filesystems
Web Servers
Graphics & Desktop
PC Hardware
Windows
Problem Solutions

  




 

 

4.1 Defining macros

The following program demonstrates the most common use of the C preprocessor. It uses the preprocessor conditional #ifdef to check whether a macro is defined:

#include <stdio.h>

int
main (void)
{
#ifdef TEST
  printf ("Test mode\n");
#endif
  printf ("Running...\n");
  return 0;
}

When the macro is defined, the preprocessor includes the corresponding code up to the closing #endif command. In this example, the macro which is tested is called TEST, and the conditional part of the source code is a printf statement which prints the message "Test mode".

The gcc option -DNAME defines a preprocessor macro NAME from the command line. If the program above is compiled with the command-line option -DTEST, the macro TEST will be defined and the resulting executable will print both messages:

$ gcc -Wall -DTEST dtest.c
$ ./a.out
Test mode
Running...

If the same program is compiled without the -D option then the "Test mode" message is omitted from the source code after preprocessing, and the final executable does not include the code for it:

$ gcc -Wall dtest.c
$ ./a.out
Running...

Macros are generally undefined, unless specified on the command line with the option -D, or in a source file (or library header file) with #define. Some macros are automatically defined by the compiler--these typically use a reserved namespace beginning with a double-underscore prefix '__'.

The complete set of predefined macros can be listed by running the GNU preprocessor cpp with the option -dM on an empty file:

$ cpp -dM /dev/null
#define __i386__ 1 
#define __i386 1 
#define i386 1 
#define __unix 1 
#define __unix__ 1 
#define __ELF__ 1 
#define unix 1 
.......

Note that this list includes a small number of system-specific macros defined by gcc which do not use the double-underscore prefix. These non-standard macros can be disabled with the -ansi option of gcc.


 
 
  Published under the terms of the GNU General Public License Design by Interspire