当为int和long均为32位且long long为64位的平台(例如clang或gcc-m32
或clang的wasm32-unknown-wasi目标)编译C时,出现关于不兼容指针类型的错误:
int32_t *i1 = NULL;
long *l1 = i1;
int64_t *i2 = NULL;
long *l2 = i2;
sizeof.c:13:11: warning: incompatible pointer types initializing 'long *' with an expression of type 'int32_t *' (aka 'int *') [-Wincompatible-pointer-types]
long *l1 = i1;
^ ~~
sizeof.c:15:11: warning: incompatible pointer types initializing 'long *' with an expression of type 'int64_t *' (aka 'long long *') [-Wincompatible-pointer-types]
long *l2 = i2;
^ ~~
2 warnings generated.
我觉得很奇怪,既与int32_t
也不int64_t
兼容long
。如果int和long相同,为什么会有警告?
C关于使类型兼容的规则在一定程度上与类型的“含义”有关,而不仅仅是大小,表示的值或表示方式。在这些规则中,指向int
和的指针long
是不同的和不兼容的类型,即使它们使用相同数量的字节并以相同的方式对地址进行编码,也指向int
和long
使用相同数量的字节并以相同的方式对数字进行编码。
C标准可以允许C实现所定义的(通过typedef
)int32_t
和int64_t
是int
,long
,或long long
,根据。在这种情况下,对应的类型不仅是兼容的,而且是相同的。但是,该标准还允许将它们定义为扩展类型,即使它们功能相同,也不同于基本整数类型。作为chqrlie笔记,你的C实现的可能定义int32_t
是int
和int64_t
是long long
,等也不是兼容的long
。
类型的“含义”涉及一些有关人类计划使用该类型的内容以及对编译器意味着什么的事情。int
最初在某种意义上意味着目标处理器具有良好的尺寸,但是随着时间的推移,这种尺寸已被削弱。可以用相同的元素定义两种结构类型,但是一种包含二维图的xy坐标,另一种包含复数的实部。将它们分开并且是不兼容的类型可以帮助程序员避免一些错误。
总的来说,诸如这样的代码int32_t x; int *p = &x;
是错误编写的,并且需要警告来指出这一点。该警告也没有障碍,因为很容易编写出所需功能的代码而不会得到警告。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句