printf("%s\n", __FILE__);       // test.c
printf("%s\n", __DATE__);       // Aug 21 2019
printf("%s\n", __TIME__);       // 01:22:18
printf("%d\n", __LINE__);       // 16
printf("%d\n", __STDC__);       // 1

// stringize
// OUTSIDE SCOPE: define macro
#define  error_message(e)  \
   printf("Error: " #e "\n")

// INSIDE SCOPE: use macro
error_message(This is an error.);
// Error: This is an error.

// defined
// OUTSIDE SCOPE: define macro
#if !defined (MESSAGE)
   #define MESSAGE "This is a message."
#endif

// INSIDE SCOPE: use macro
printf("%s\n", MESSAGE);
// This is a message.

// parameterized macros
// OUTSIDE SCOPE: define macro
#define square(x) ((x) * (x))
#define MAX(a,b) ((a) > (b) ? (a) : (b))

printf("%d\n", square(2));                  // 4
printf("%d\n", MAX(4,5));                   // 5