これは、2つのGCC拡張機能(式ステートメント({ ... })
と)を使用しtypeof()
ます。
- 展開の最初の行は、名前付き型の変数を宣言します
type
。
- 展開の2行目は、変数または式と同じ型の変数を宣言しています
x
。
- 3行目は、2つのポインターを比較します。これは、2つのダミー変数のタイプが一致する場合にのみ一致し、ポインターの不一致の警告(またはでコンパイルする場合はエラー)を生成します
-Werror
。
- 最後の行(を含む
1
)は、式の値です—trueと同等です。
x
したがって、のタイプが指定されたタイプと同じでない場合は、コンパイルの警告/エラーが発生します。
コード例:
#include <stdio.h>
#define typecheck(type,x) \
({ type __dummy; \
typeof(x) __dummy2; \
(void)(&__dummy == &__dummy2); \
1; \
})
int main(void)
{
int x;
if (typecheck(int, x))
printf("int x OK\n");
if (typecheck(double, x))
printf("double x OK\n");
return(0);
}
コンパイルメッセージ:
$ /usr/bin/gcc -O3 -g -std=gnu99 -Wall -Wextra xx.c -o xx
xx.c: In function ‘main’:
xx.c:15: warning: comparison of distinct pointer types lacks a cast
$
を使用しなかったため-Werror
、コードは「OK」をコンパイルしたことに注意してください。出力は次のとおりです。
int x OK
double x OK