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

zwo*_*wol 18 c autoconf types

仅使用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)

Nik*_* C. 7

我认为你应该能够利用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.它们具有相同的布局,可以互换使用.实际上,它们属于同一类型.