【发布时间】:2013-02-05 21:35:22
【问题描述】:
仅使用 C89 的特性,给定
typedef [unspecified token sequence] T1;
typedef [another unspecified token sequence] T2;
展示一种语言结构,当且仅当 T1 和 T2 是相同类型(不仅仅是兼容)时,该语言结构将无错误地编译。对 C89 的限制是因为这将进入 autoconf 探测。
编辑:我需要一个即使 T1 或 T2 或两者都是不完整类型的解决方案。很抱歉之前没有提到这一点。
编辑之子:所有三个当前答案仅检测兼容类型。事实证明,这比我记得的更接近“相同类型”,对于我目前的目的来说足够接近,但出于好奇,我仍在寻找检测 相同 类型的答案。以下是一些兼容但不相同的类型:
typedef void (*T1)(void);
typedef void (*T2)();
typedef float T1[];
typedef float T2[12];
typedef enum { ONE, TWO, THREE } T1;
typedef /* implementation-defined integer type */ T2;
【问题讨论】:
-
我想编译器警告不够好?
-
@NikosC。如果用
-Werror编译,警告会变成错误,所以应该没问题。 -
出于操作原因,我更希望出现硬错误(不必在 autoconf 探测中使用 CFLAGS),但会发出警告。
-
@technosaurus 如果 expression (从技术上讲,一个整数常量表达式)计算结果为某个固定值,则有几种这样的技巧可以使构建失败,但据我所知,它们都不能用于测试 C89 中的 type 相等性。