Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果两种类型不相同,则会导致C89中的编译错误_C_Types_Autoconf - Fatal编程技术网

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

如果两种类型不相同,则会导致C89中的编译错误,c,types,autoconf,C,Types,Autoconf,仅使用C89的功能,如下所示 typedef [unspecified token sequence] T1; typedef [another unspecified token sequence] T2; 展示一种语言结构,当且仅当T1和T2是同一类型(不只是兼容)时,它将编译而不会出错。C89的限制是因为它将进入autoconf探测器 编辑:我需要一个解决方案,即使T1或T2或两者都是不完整的类型,该解决方案仍然有效。很抱歉之前没有提到这一点 编辑之子:所有三个当前答案仅检测兼容类型。事

仅使用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%防水的。但是,我们必须记住,对于
枚举
,没有什么事情是不能用
无符号
完成的。它们具有相同的布局,可以互换使用。实际上,它们是同一类型的

T1 t1;
T2 *t2 = &t1;
如果T1和T2不相同,则这是一个约束冲突

或者


我想编译器警告还不够好?@NikosC。如果使用
-Werror
编译,则警告将变为错误,因此这可能没问题。出于操作原因,我更喜欢硬错误(不必在autoconf探测中弄脏CFLAGS),但警告也可以。请参阅:@technosaurus如果表达式(从技术上讲,是一个整数常量表达式)计算为某个固定值,但据我所知,没有一个可以用于测试C89中的类型相等性。很好!是的,这是我想要的行为。在我接受你的答案之前,我将严格检查标准对该构造的说明,但我很确定你是对的。在检查C99时,如果
T1
不正确,则这不起作用2
或两者都是不完整的类型。这可以通过将
t1
的声明分别指向
t1
T2
来解决。而且,从技术上讲,它只要求t1和T2是兼容的类型。这更接近于“同一类型”但我还是很好奇是否能检测到严格的类型相等。@Zack我不知道你的意思。如果类型不同,我就无法编译。你能举一个例子,说明它在编译时类型不同吗?@Zack不要紧,我用e找到了一个反例妈妈。这些也只检测兼容类型,而不是相同的类型。嗯。后者不应该要求相同的类型,而不仅仅是兼容吗?函数原型返回类型方法似乎与
extern
答案具有相同的结果,包括不捕捉
enum
unsigned
不同。我找不到任何常量raint(在C99中;我没有C89的电子副本)对于比6.7p4更严格的函数定义,“同一范围内引用相同对象或函数的所有声明都应指定兼容类型。”6.7.5.3p15说“对于两个要兼容的函数类型,两者都应指定兼容的返回类型。此外,[…]”(我的重点)。
T1 f();
T2 f() {}