Für ähnliche Überraschungen ist übrigens auch dieser Code gut:
1 | #define TRACE(x) if (trace) printf(x)
|
2 |
|
3 | if (a > 100)
|
4 | TRACE("Sollte nicht vorkommen");
|
5 | else
|
6 | printf("Hallo");
|
weil sich das dem Compiler tatsächlich als
1 | if (a > 100)
|
2 | if (trace)
|
3 | printf(x);
|
4 | else
|
5 | printf("Hallo");
|
darstellt.
Schreibt man statt dessen
1 | #define TRACE(x) if (trace) { printf(x); }
|
dann kriegt man de fakto
1 | if (a > 100)
|
2 | if (trace) { printf(x); };
|
3 | else
|
4 | printf("Hallo");
|
und damit einen Syntax Error.
Aus diesem Grund klammert man das gern als
1 | #define TRACE(x) do{ if (trace) printf(x); }while(0)
|