- Macros just expanded out by the compiler, which means code is copied around.
- Macros are not type safe. A template will compare the input types and check them against the type you spec'ed when using it.
- Macros don't obey C++'s namespaces and locality rules they can be active in unexpected places in the code. Consider what happen if someone was to make a macro "i" in a random header some where.
- The result of the macro is what the compiler really works on so errors are more troublesome to find.. it helps to know that with gcc and g++ the "-E" command line option will stop after the pre-processor has completed.
For example;
//compile with g++ file_name #define MIN(a,b) (((a)<(b)) ? (a) : (b)) template<class T> T min(T a,T b) { return (a<b) ? a : b; } int main() { int x = 10; int y = 20; int macro = MIN(x*3,y); int tplate = min<int>(x*3,y); }
Now expand it and view the result , notice the macro duplicated its inputs;
//run g++ -E file_name # 1 "macro_template.cpp" # 1 "" # 1 " " # 1 "macro_template.cpp" template<class T> T min(T a,T b) { return (a<b) ? a : b; } int main() { int x = 10; int y = 20; int macro = (((x*3)<(y)) ? (x*3) : (y)); int tplate = min<int>(x*3,y); }
No comments:
Post a Comment