『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)