这使用了两个 GCC 扩展——表达式语句({ ... })
和typeof()
.
- 展开的第一行声明了一个命名类型的变量
type
。
- 扩展的第二行声明了一个与变量或表达式相同类型的变量
x
。
- 第三行比较两个指针,只有当两个虚拟变量的类型匹配时才会匹配,产生指针不匹配警告(如果用 编译则错误
-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