0

失敗したマクロ

マクロ (コンピューター サイエンス)

上記の記事を読んだ後でも、マクロが単なる関数なのかそれ以外のものなのか、まだよくわかりません。マクロは関数と同じですか?

例:

    //  Create a Direct3D 9 device.
    hr = direct3D9->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, g_hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dPP, &d3dDevice);

    //  Cout out the message to indicate the failure.
    if(FAILED(hr))
       return 0;
4

1 に答える 1

6

C および C++ では、マクロは「これをそれで置き換える」タイプのメカニズムであり、多くの意味で関数とまったく同じではありません。関数を置き換えるために使用されることもありますが、十分に注意する必要があります。関数として使用されるマクロのいくつかの有名な「失敗」は次のとおりです。

#define SQR(x) x * x

.... 

int x = 5;
int s = SQR(x+1);

これは 36 にはなりませんが、(x + 1 * x + 1) になり、私の頭では 12 になります。x関数を使用するか、SQRマクロに余分な括弧を追加することで修正できます。

マクロのもう 1 つの「賢い」使い方:

#define IS_UPPER(c)  ((c) >= 'A' && (c) <= 'Z')

char *str = "Some String With a few Upper Case letters";
int uppers = 0;
while(*str) if (IS_UPPER(*str++)) uppers++;

さて、これはうまくいかないでしょう (この特定のケースでは、エンドマーカーの「欠落」によるクラッシュを回避し、続行し続けると、アッパーはゼロであることが保証されます...)。

IS_UPPER(*str++)

に変換します。

(*str++) >= 'A' && (*str++) <= 'Z'

が文字列 "Some ..." の先頭にある場合str、最初のステップでは true になりますが、2 番目のステップでは true ではありません。 Z'. 関数を使用すると、ここで「期待どおり」に機能します。

于 2013-06-30T09:29:49.920 に答える