...macro.h....
/***Dangerouse Macro1***/
#define print_int_value_twice(c) do{\
printf("first time %c second time %c\n",c,c);\
}while(0);
/***Stupid Preprocessor***/
#define my_error(c) do{\
fprintf(stderr,"Error::");
fprintf(stderr,c);
fprintf(stderr,"\n");
exit(1);
}while(0);
.....macro user ....
j=0;
print_int_value_twice(j++);
/*j incremented twice by the preprocessor*/
/*In this case the preprocessor is stupid
not treat the string spanned across several lines
as a incomplete macro argument and fails compilation.*/
my_error(" My error spans three lines
line1
line2");
Avoid MACROS start using inlines , if you define macros the users should use them with caution