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

[C言語] Cプログラミングの落とし穴 6.2 マクロは関数ではない P85 その2

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

この本はいわゆるANSI C(C89規格)策定中に書かれており、今読んでいるところについてはC89では修正されているようです。つまり”マクロは関数である”という状態になっています。

下記コードではmaxマクロ内の数値比較と数値選択のところで計2回インクリメントが出現するので、x[1]が飛ばされx[2]にあたる1が選択されて変数biggestは1になってしまうという著者の指摘通りにはなりません。

biggest = ((biggest) > (x[i++])?(biggest) : (x[i++]));

#include <stdio.h>

#define N 3
#define max(a,b) ((a) > (b) ? (a):(b))

int main() {
    int x[N];
    x[0] = 2;
    x[1] = 3;
    x[2] = 1;
    
    int biggest = x[0];

    int i = 0;
    while (i < N){
        biggest = max(biggest, x[i++]);
    }

    printf("biggest : %d\n", biggest);

    return 0;
}
biggest : 3

[C言語] Cプログラミングの落とし穴 6.2 マクロは関数ではない P84

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

少しずつ読み進めています。

#include <stdio.h>

#define abs(x) (((x) >= 0) ? (x):-(x))
#define max(a,b) ((a) > (b) ? (a):(b))

int main() {
    int a = -10;
    int a_abs = abs(a);

    int b = 100;
    int ab_max = max(a, b);

    printf("a_abs : %d\n", a_abs);
    printf("ab_max : %d\n", ab_max);

    return 0;
}
a_abs : 10
ab_max : 100