仅使用C89的功能
typedef [unspecified token sequence] T1;
typedef [another unspecified token sequence] T2;
Run Code Online (Sandbox Code Playgroud)
展示一种语言结构,当且仅当T1和T2是相同的类型(不仅仅是兼容的)时,它将无错误地编译.对C89的限制是因为这将进入autoconf探测器.
编辑:我需要一个解决方案,即使T1或T2或两者都是不完整的类型.很抱歉之前没有提到这个.
SON OF EDIT:所有三个当前答案仅检测兼容类型.事实证明这比我记忆中的"相同类型"更接近,足够接近我目前的目的,但出于好奇,我仍然在寻找能够检测到相同类型的答案.以下是一些兼容但不相同的类型:
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;
Run Code Online (Sandbox Code Playgroud)
我认为你应该能够利用extern声明的严格类型检查:
typedef int T1;
typedef char T2;
extern T1 t1;
T2 t1;
Run Code Online (Sandbox Code Playgroud)
以上不会编译.将T2更改为a int将允许源正确构建.
这也不会编译:
typedef int T1;
typedef unsigned int T2;
extern T1 t1;
T2 t1;
Run Code Online (Sandbox Code Playgroud)
即使两种类型都是int.我认为这就是你想要的.
但是,这不会触发错误:
typedef emum {Foo} T1;
typedef unsigned T2;
Run Code Online (Sandbox Code Playgroud)
所以它不是100%防水.然而,人们必须记住,没有人可以做任何事情enum也无法做到unsigned.它们具有相同的布局,可以互换使用.实际上,它们属于同一类型.