如果两种类型不相同,则会导致C89中的编译错误

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

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

typedef int T1;
typedef char T2;

extern T1 t1;    
T2 t1;

以上不会编译。 将T2更改为int将允许源构建正确。

这也不会编译:

typedef int T1;
typedef unsigned int T2;

extern T1 t1;    
T2 t1;

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

但是,这不会触发错误:

typedef emum {Foo} T1;
typedef unsigned T2;

所以它不是100%防水的。 但是,我们必须记住,没有办法用enum那些不能用unsigned来完成的enum 。 它们具有相同的布局,可以互换使用。 实际上,它们是同一类型的。


T1 t1;
T2 *t2 = &t1;

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

要么,

T1 f();
T2 f() {}
链接地址: http://www.djcxy.com/p/73559.html

上一篇: Cause compilation error in C89 if two types are not the same

下一篇: Where is struct with no named members useful?