在A a =(A)b中是否需要显式类型转换;

Peng Zhang

我正在阅读一些开源C代码,并且A a = (A) b;多次遇到类型转换。例如,

static void hexdump(const void* pv, int len)
{
  const unsigned char* p = (const unsigned char*) pv;
  // some other code
}

A a = (A) b;代码主要发生在b指针,void *指针最频繁的时候。我有C ++背景。我认为在C ++中,赋值运算符会=自动处理类型转换吗?因为它已经知道a类型了A

在C中是否需要显式类型转换?

阿德里亚诺·雷佩蒂(Adriano Repetti)

不,在C中从转换void*char*C(这是一个常见的示例,以说明它们之间的不同!)是隐式的,因此无需进行强制转换(然后出错,因为如果您错误地更改char,可能会隐藏问题int)。

引用由K&R(§A.6.8撰写的C编程语言,第二版”

任何指向对象的指针都可以转换为void *类型,而不会丢失信息。如果将结果转换回原始指针类型,则将恢复原始指针。与通常需要显式转换的第A.6.6节中讨论的指针到指针的转换不同,可以将指针分配给void *类型的指针或从指针中分配指针,并将指针与它们进行比较。

请注意“如果将结果转换回原始指针类型”,这是至关重要的:如果不是char*您的结果,int*可能由于内存对齐而出错。

根据C99标准(第6.3.2.3节),何时可以进行转换:

指向void的指针可以转换为任何不完整或对象类型的指针或从该指针转换为任何不完整或对象类型的指针。指向任何不完整或对象类型的指针都可以转换为指向void的指针,然后再次返回。结果应等于原始指针。

现在,让我们看看C11(n1570)§6.5.4p3中何时可以隐式表示(感谢mafso进行了快速搜索)

除6.5.16.1的约束所允许的地方外,涉及指针的转换应通过显式强制转换来指定。

然后§6.5.16.1

满足以下条件之一:[...]左操作数具有原子,限定或不限定的指针类型,并且(考虑到左操作数在左值转换后将具有的类型),一个操作数是指向对象类型的指针,并且另一个是指向void的合格或不合格版本的指针,并且左侧指向的类型具有右侧指向的类型的所有限定符

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Java

Java中的显式类型转换示例

来自分类Dev

了解 postgresql 中的显式类型转换

来自分类Dev

了解SQL中的显式类型转换

来自分类Dev

显式类型转换?

来自分类Dev

无法选择最佳候选函数。您可能需要在Postgres中添加显式类型转换

来自分类Dev

F#中类型为List的成员是否需要显式缓存

来自分类Dev

您可能需要添加显式类型转换

来自分类Dev

无法隐式转换类型,存在显式转换(您是否缺少强制转换?)

来自分类Dev

%p格式说明符需要将除printf中的char *以外的所有类型显式转换为void *

来自分类Dev

在Python 2.7中,是否需要显式导入子模块?

来自分类Dev

是否需要在C#中显式引发异常?

来自分类Dev

如何在 Go 中显式转换类型?

来自分类Dev

C / C ++中的显式类型转换运算符

来自分类Dev

C ++ / CLI中C#类的显式类型转换

来自分类Dev

显式/隐式类型转换C ++

来自分类Dev

显式类型转换与使用类型规则

来自分类Java

Java何时需要显式类型参数?

来自分类Dev

Kotlin需要显式转换为Object

来自分类Java

为什么显式类型转换需要从double到float而不是从int到byte?

来自分类Dev

SQLAlchemy + Postgres:合并时“您可能需要添加显式类型转换”

来自分类Dev

为什么我需要在C#显式实现中将'this'转换为接口类型?

来自分类Dev

Python数据集模块错误:您可能需要添加显式类型强制转换

来自分类Dev

web2py错误:您可能需要添加显式类型强制转换

来自分类Dev

您是否需要显式绑定功能?

来自分类Java

我是否需要显式关闭连接?

来自分类Javascript

如果esModuleInterop是true,那么我是否需要显式的allowSyntheticDefaultImports配置TypeScript转换?

来自分类Dev

将void *值设置为intptr_t变量是否需要显式转换?

来自分类Dev

在C级别上的显式类型转换

来自分类Dev

类型转换,显式构造函数等

Related 相关文章

  1. 1

    Java中的显式类型转换示例

  2. 2

    了解 postgresql 中的显式类型转换

  3. 3

    了解SQL中的显式类型转换

  4. 4

    显式类型转换?

  5. 5

    无法选择最佳候选函数。您可能需要在Postgres中添加显式类型转换

  6. 6

    F#中类型为List的成员是否需要显式缓存

  7. 7

    您可能需要添加显式类型转换

  8. 8

    无法隐式转换类型,存在显式转换(您是否缺少强制转换?)

  9. 9

    %p格式说明符需要将除printf中的char *以外的所有类型显式转换为void *

  10. 10

    在Python 2.7中,是否需要显式导入子模块?

  11. 11

    是否需要在C#中显式引发异常?

  12. 12

    如何在 Go 中显式转换类型?

  13. 13

    C / C ++中的显式类型转换运算符

  14. 14

    C ++ / CLI中C#类的显式类型转换

  15. 15

    显式/隐式类型转换C ++

  16. 16

    显式类型转换与使用类型规则

  17. 17

    Java何时需要显式类型参数?

  18. 18

    Kotlin需要显式转换为Object

  19. 19

    为什么显式类型转换需要从double到float而不是从int到byte?

  20. 20

    SQLAlchemy + Postgres:合并时“您可能需要添加显式类型转换”

  21. 21

    为什么我需要在C#显式实现中将'this'转换为接口类型?

  22. 22

    Python数据集模块错误:您可能需要添加显式类型强制转换

  23. 23

    web2py错误:您可能需要添加显式类型强制转换

  24. 24

    您是否需要显式绑定功能?

  25. 25

    我是否需要显式关闭连接?

  26. 26

    如果esModuleInterop是true,那么我是否需要显式的allowSyntheticDefaultImports配置TypeScript转换?

  27. 27

    将void *值设置为intptr_t变量是否需要显式转换?

  28. 28

    在C级别上的显式类型转换

  29. 29

    类型转换,显式构造函数等

热门标签

归档