//linux, -Wall -Wextra -Wpedantic -Wshadow #include #include #define COLOR_RESET "\x1B[0m" #define COLOR_RED "\x1B[31m" #define COLOR_GREEN "\x1B[32m" #define COLOR_YELLOW "\x1B[33m" char g_info_msg[] = COLOR_GREEN "INFO: " COLOR_RESET; char g_error_msg[] = COLOR_RED "ERROR: " COLOR_RESET; char g_warning_msg[] = COLOR_YELLOW "WARNING: " COLOR_RESET; #define PRINT_INFO_MESSAGE_1(...) printf( "%s", g_info_msg ); printf(__VA_ARGS__) //#define PRINT_ERROR_MESSAGE_1(...) printf( "%s", g_error_msg ); printf(__VA_ARGS__) //#define PRINT_WARNING_MESSAGE_1(...) printf( "%s", g_warning_msg ); printf(__VA_ARGS__) #define PRINT_INFO_MESSAGE_2(...) { printf( "%s", g_info_msg ); printf(__VA_ARGS__); } //#define PRINT_ERROR_MESSAGE_2(...) { printf( "%s", g_error_msg ); printf(__VA_ARGS__); } //#define PRINT_WARNING_MESSAGE_2(...) { printf( "%s", g_warning_msg ); printf(__VA_ARGS__); } int main() { int test_var = 1; // note: some parts of macro expansion are not guarded by this ‘if’ clause if ( test_var ) //warning: macro expands to multiple statements in expansion of macro ‘PRINT_INFO_MESSAGE_1’ PRINT_INFO_MESSAGE_1("message 1\n"); // error: ‘else’ without a previous ‘if’ else PRINT_INFO_MESSAGE_1("message 2\n"); if ( test_var ) { PRINT_INFO_MESSAGE_1("message 3\n"); } else { PRINT_INFO_MESSAGE_1("message 4\n"); } if ( test_var ) PRINT_INFO_MESSAGE_2("message 5\n") else PRINT_INFO_MESSAGE_2("message 6\n") if ( test_var ) { PRINT_INFO_MESSAGE_2("message 7\n") } else { PRINT_INFO_MESSAGE_2("message 8\n") } return 0; }