gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 16:29:56 26 4
gpt4 key购买 nike

仅使用 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 也做不到。它们具有相同的布局,可以互换使用。实际上,它们是同一类型。

关于如果两种类型不相同导致 C89 中的编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14987395/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com