[C言語] Cプログラミングの落とし穴 6.4 マクロは型定義ではない P90

『Cプログラミングの落とし穴』(A.コーニグ, 1990)
[M1 Mac, Big Sur 11.7.2, clang 13.0.0, NO IDE]

defineで型定義は一応できるものの、変数宣言はtypedefのようにまとめてはできません。

変数のデータ型はtypeof()関数で取得できますが、これを正式に出力する方法はありません。printfで適当な型として出力させると警告内に型が表示されます。

#include <stdio.h>

#define T1 struct foo *
typedef struct foo *T2;

int main() {
    T1 a; T1 b; // T1 a, b;ではエラーになる
    T2 c, d;

    printf("a : %s\n", a);
    printf("b : %s\n", b);
    printf("c : %s\n", c);
    printf("d : %s\n", d);

    return 0;
}
src/test.c:10:24: warning: format specifies type 'char *' \
but the argument has type 'struct foo *' [-Wformat]
    printf("a : %s\n", a);
                ~~     ^
src/test.c:11:24: warning: format specifies type 'char *' \
but the argument has type 'struct foo *' [-Wformat]
    printf("b : %s\n", b);
                ~~     ^
src/test.c:12:24: warning: format specifies type 'char *' \
but the argument has type 'T2' (aka 'struct foo *') [-Wformat]
    printf("c : %s\n", c);
                ~~     ^
src/test.c:13:24: warning: format specifies type 'char *' \
but the argument has type 'T2' (aka 'struct foo *') [-Wformat]
    printf("d : %s\n", d);
a : (null)
b : (null)
c : (null)
d : (null)