如果两种类型不相同,则会导致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