int和long的不兼容指针相同吗?

corvus_192

当为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相同,为什么会有警告?

埃里克·波斯蒂奇(Eric Postpischil)

C关于使类型兼容的规则在一定程度上与类型的“含义”有关,而不仅仅是大小,表示的值或表示方式。在这些规则中,指向int和的指针long是不同的和不兼容的类型,即使它们使用相同数量的字节并以相同的方式对地址进行编码,也指向intlong使用相同数量的字节并以相同的方式对数字进行编码。

C标准可以允许C实现所定义的(通过typedefint32_tint64_tintlong,或long long,根据。在这种情况下,对应的类型不仅是兼容的,而且是相同的。但是,该标准还允许将它们定义为扩展类型,即使它们功能相同,也不同于基本整数类型。作为chqrlie笔记,你的C实现的可能定义int32_tintint64_tlong long,等也不是兼容的long

类型的“含义”涉及一些有关人类计划使用该类型的内容以及对编译器意味着什么的事情。int最初在某种意义上意味着目标处理器具有良好的尺寸,但是随着时间的推移,这种尺寸已被削弱。可以用相同的元素定义两种结构类型,但是一种包含二维图的xy坐标,另一种包含复数的实部。将它们分开并且是不兼容的类型可以帮助程序员避免一些错误。

总的来说,诸如这样的代码int32_t x; int *p = &x;是错误编写的,并且需要警告来指出这一点。该警告也没有障碍,因为很容易编写出所需功能的代码而不会得到警告。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

指针类型和常量不兼容

来自分类Dev

Pascal指向指针SyntaxError和不兼容类型的指针

来自分类Dev

OpenSSL和Mcrypt不兼容吗?

来自分类Dev

URLEncoder和URLDecoder不兼容吗?

来自分类Dev

kCGImagePropertyOrientation不兼容的指针

来自分类Dev

不兼容的指针类型

来自分类Dev

不兼容的 C 指针

来自分类Dev

使用scandir()的分段错误和不兼容的指针类型警告

来自分类Dev

函数指针和函数由于参数不兼容

来自分类Dev

不兼容的类型:“常规过程和方法指针”

来自分类Dev

错误:将“long int (*)[4]”赋值给“long int [4][4]”时的类型不兼容

来自分类Dev

不兼容的块指针类型

来自分类Dev

指针类型不兼容警告

来自分类Dev

不兼容的指针类型从'int(int *)'分配给'void(*)(void *)'

来自分类Dev

Getter Setter:不兼容的指针转换,将“ int”发送到类型为“ int *”的参数

来自分类Dev

向整数转换发送不兼容的指针,将“ NSNumber *”发送到“ long”类型的参数

来自分类Dev

指向指针的指针类型不兼容

来自分类Dev

指向指针的指针类型不兼容

来自分类Dev

Zurb Foundation 5和Jquery 3不兼容吗?

来自分类Dev

Zurb Foundation 5和Jquery 3不兼容吗?

来自分类Dev

不兼容的操作数类型Die和Int

来自分类Dev

通过指向无符号long long long的指针访问int会导致UB吗?

来自分类常见问题

错误:指向指针转换的不兼容整数从'int'分配给'string'(aka'char *')

来自分类Dev

指向类型为“ id”的表达式的整数转换“ int”的指针不兼容

来自分类Dev

不兼容的块指针类型向'NSComparator'类型的参数发送'int(^)(__ strong id,__strong id)'

来自分类Dev

指针转换不兼容的整数,从'int'分配给'CGFloat *'(aka'float *')

来自分类Dev

错误:指向指针转换的不兼容整数从'int'分配给'string'(aka'char *')

来自分类Dev

如何修复不兼容的指针,将整数转换从“ void *”分配给“ int”

来自分类Dev

不兼容的块指针类型向'NSComparator'类型的参数发送'int(^)(__ strong id,__strong id)'

Related 相关文章

  1. 1

    指针类型和常量不兼容

  2. 2

    Pascal指向指针SyntaxError和不兼容类型的指针

  3. 3

    OpenSSL和Mcrypt不兼容吗?

  4. 4

    URLEncoder和URLDecoder不兼容吗?

  5. 5

    kCGImagePropertyOrientation不兼容的指针

  6. 6

    不兼容的指针类型

  7. 7

    不兼容的 C 指针

  8. 8

    使用scandir()的分段错误和不兼容的指针类型警告

  9. 9

    函数指针和函数由于参数不兼容

  10. 10

    不兼容的类型:“常规过程和方法指针”

  11. 11

    错误:将“long int (*)[4]”赋值给“long int [4][4]”时的类型不兼容

  12. 12

    不兼容的块指针类型

  13. 13

    指针类型不兼容警告

  14. 14

    不兼容的指针类型从'int(int *)'分配给'void(*)(void *)'

  15. 15

    Getter Setter:不兼容的指针转换,将“ int”发送到类型为“ int *”的参数

  16. 16

    向整数转换发送不兼容的指针,将“ NSNumber *”发送到“ long”类型的参数

  17. 17

    指向指针的指针类型不兼容

  18. 18

    指向指针的指针类型不兼容

  19. 19

    Zurb Foundation 5和Jquery 3不兼容吗?

  20. 20

    Zurb Foundation 5和Jquery 3不兼容吗?

  21. 21

    不兼容的操作数类型Die和Int

  22. 22

    通过指向无符号long long long的指针访问int会导致UB吗?

  23. 23

    错误:指向指针转换的不兼容整数从'int'分配给'string'(aka'char *')

  24. 24

    指向类型为“ id”的表达式的整数转换“ int”的指针不兼容

  25. 25

    不兼容的块指针类型向'NSComparator'类型的参数发送'int(^)(__ strong id,__strong id)'

  26. 26

    指针转换不兼容的整数,从'int'分配给'CGFloat *'(aka'float *')

  27. 27

    错误:指向指针转换的不兼容整数从'int'分配给'string'(aka'char *')

  28. 28

    如何修复不兼容的指针,将整数转换从“ void *”分配给“ int”

  29. 29

    不兼容的块指针类型向'NSComparator'类型的参数发送'int(^)(__ strong id,__strong id)'

热门标签

归档