【C言語】
#defineの使い方で負の定数(-1)は括弧で括らないといけないのか?

この記事の概要

この記事では、C言語の#defineマクロで負の定数(例: -1)を定義する際、括弧で囲む重要性を解説しています。括弧を付けないと意図しない式展開が起こり、誤動作の原因になります。正の定数では括弧が不要である理由や、標準ライブラリの例も挙げ、安全なマクロ定義の方法を説明しています。


&1[ary]は&ary[1]と同じ

#include <stdio.h>
//負の定数を括弧で括らないといけない理由
//&1[ary]は&ary[1]と同じ
int main(){
    int ary[] = {[0]=100,[1]=200,[2]=300};
    int *ptr = &ary[1];

    #define     Godzilla    (-1)
    printf("%d\n",-Godzilla[ptr]);

    #undef      Godzilla
    #define     Godzilla    -1
    printf("%d\n",-Godzilla[ptr]);
}

マクロを展開すると

gcc -E   f1.c | tail -11
int main(){
    int ary[] = {[0]=100,[1]=200,[2]=300};
    int *ptr = &ary[1];


    printf("%d\n",-(-1)[ptr]);



    printf("%d\n",- -1[ptr]);
}

実行結果

./a.out
-100
300

負の定数を括弧で括った例

grep  EOF  /usr/include/stdio.h
#define EOF (-1)

正の定数に括弧は不要

grep  SHRT_MAX  /usr/include/limits.h
#  define SHRT_MAX      32767
#  define USHRT_MAX     65535

つまり
define SHRT_MAX  (32767)
等の括弧は不要です。