The well-known #define and #if..#endif is no big deal. But from time to time, we might want to use some features that provided by the CPP.

Concatenation of tokens

All input to CPP are text strings and therefore we can do concatenation of strings like this:

#define NAMEVALUE(x,y,z) x##y(z)

Then by doing

NAMEVALUE(pri,ntf,"hello world\n");

it resolves to

printf("hello world\n");


To put stuff as string, we are not using "x" but #x, for example

#define DEBUGPRINT(x) printf("%s = %d\n",#x,x)

Then doing


will output something like

x = 3

Predefined Macros

  • __FILE__ resolves into the filename of the source code file.
  • __LINE__ resolves into the source line number
  • __DATE__ and __TIME__ resolves into the compile date and time
  • __func__ resolves into the function name, only in C99