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'. 関数を使用すると、ここで「期待どおり」に機能します。