On 2011-10-21 10:32, Gor Gyolchanyan wrote:
That's ALL you can do in C. fill structs and call functions (fundamental type manipulation doesn't count). My personal research shows the following use cases of C macros (sorted by popularity in descending order): 1. enum 2. alias (most notably, conditionally compiled ones) 3. CTFE function 4. mixin template 5. syntactic alias 6. syntactic mixin template
I guess it's quite difficult for a compiler to recognize the differences between these use cases.
only the last 2 out of 6 cannot be translated to D. An example of a syntactic alias is this very common piece of C code: #ifdef __VERY_VERY_OLD_C_COMPILER__ #define CONST #else #define CONST const #endif An example of a syntactic mixin template is this piece of code, which i never actually saw anywhere (possible only in C99 and C++): #define N_TIMES(n) for(int i = 0; i != n; ++i) The last use case is very rare. The only legitimate example i ever saw is in libjpeg, where a macro is used to define function pointers of API functions. The use case before that is mostly used for portability reasons, which is not necessary in D. Some non-standard extension encapsulating macros are almost always used in C libraries, which can be removed altogether. The translation can go on regarding the above use cases and the last two cases can be evaluated in-line, commented out and warned about for manual translation.
Something similar is used in the Boost library for its "foreach" macro. -- /Jacob Carlborg