19

仅使用 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;
4

2 回答 2

7

我认为您应该能够利用extern声明的严格类型检查:

typedef int T1;
typedef char T2;

extern T1 t1;    
T2 t1;

以上将无法编译。将 T2 更改为 anint将允许源正确构建。

这也不会编译:

typedef int T1;
typedef unsigned int T2;

extern T1 t1;    
T2 t1;

即使这两种类型都是int. 我认为这是你想要的。

但是,这不会触发错误:

typedef emum {Foo} T1;
typedef unsigned T2;

所以它不是 100% 防水的。但是,必须记住,没有任何事情可以用 an 做enum,也不能用unsigned. 它们具有相同的布局,可以互换使用。实际上,它们是同一类型。

于 2013-02-20T19:00:46.203 回答
2
T1 t1;
T2 *t2 = &t1;

如果 T1 和 T2 不相同,则这是违反约束的。

或者,

T1 f();
T2 f() {}
于 2013-02-20T20:24:08.323 回答