マクロで使用できるトリックは何ですか?

C では、逐語的な引数を取得する何らかの処理を実行するマクロを定義し、同時にそのアドレスを透過的に取得できるように関数を定義するのが一般的です。

// could evaluate at compile time if __builtin_sin gets
// special treatment by the compiler
#define sin(x) __builtin_sin(x)

// parentheses avoid substitution by the macro
double (sin)(double arg) {
    return sin(arg); // uses the macro
}

int main() {
    // uses the macro
    printf("%f\n", sin(3.14));

    // uses the function
    double (*x)(double) = &sin;

    // uses the function
    printf("%f\n", (sin)(3.14));
}

DRY および単純なコード生成に役立つ X マクロ イディオムもあります:

未定義を使用して、ヘッダー gen.x で一種のテーブルを定義します。 マクロ :

/** 1st arg is type , 2nd is field name , 3rd is initial value , 4th is help */
GENX( int , "y" , 1 , "number of ..." );
GENX( float , "z" , 6.3 , "this value sets ..." );
GENX( std::string , "name" , "myname" , "name of ..." );

その後、通常は異なる定義で #include ごとに定義して、さまざまな場所で使用できます:

class X
{
public :

     void setDefaults()
     {
#define GENX( type , member , value , help )\
         member = value ;
#include "gen.x"
#undef GENX
     }

     void help( std::ostream & o )
     {
#define GENX( type , member , value , help )\
          o << #member << " : " << help << '\n' ;
#include "gen.x"
#undef GENX
     }

private :

#define GENX( type , member , value , help )\
     type member ;
#include "gen.x"
#undef GENX
}

最もクールなマクロは、アサート、ガードのインクルード、__FILE__、__LINE__ です。
コードで他のマクロを使用しないでください。

編集:
マクロは法的な解決策がない場合にのみ使用してください。