Why Macro in C is So Notorious
01 January 2006
In C programming language, macro is kind of notorious. Fortunately, we have alternative solutions in many cases. But there are still people who prefer macro as they may not aware of the risks of using macro. Therefore, I would like to list some in this post.
- Side effects
If a expression passed to macros has side effects, the outcome might be unexpected:
#define POWER(x) (x)(x) int i = 1; SQUARE(++i); // bug SQUARE(i++); // bug even subtle
In C++, we may use either inline functions or templates instead.
# inline function version inline int mySquare(const int i){return ii;} # template version template T mySquare(cosnt T& i){return ii;}
- Lack of grammar check
In many implementations of
stdio.h
,getchar
andputchar
are defined macros. The error in the following code snippet is thatputchar
is provided with no parameter. But, can you tell that from compilation error message?/* test.c */ #include <stdio.h> /* In stdio.h #define putchar(x) putc(x, stdout) */ int main() { putchar (); return 0; }
$ gcc test.c test.c: In function `main': test.c:5: error: parse error before ',' token $ gcc --version test.c gcc (GCC) 3.4.4 (cygming special) (gdc 0.12, using dmd 0.125) Copyright (C) 2004 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- Cannot single-step debug
- Cross-reference tools cannot handle/expand macros
Is not protected by namespace
namespace na { #define NUM 1 } namespace nb { #define NUM 2 }
blog comments powered by Disqus