我相信在下面的代码中,C“自动将17转换为int *
”,正如有人最近指出的那样(但没有说明原因),这是错误的。
int *ptoi = 17; // I assumed that 17 is being automatically casted to int *
我知道如果我在C ++中做同样的事情,我会收到错误invalid conversion from int to int *
。但是,如果我在C ++中执行以下操作,它可以正常工作:
int *ptoi = (int *)17;
这些是我认为在C中,铸造是隐含的原因。
有人可以解释为什么,在C ++中,我必须使用它,但在C中,它可以正常工作吗?
答案 0 :(得分:17)
从整数到没有强制转换的指针的转换在C中也是非法的。大多数编译器会让你逃脱它。 Clang发出警告:
example.c:5:8: warning: incompatible integer to pointer conversion initializing
'int *' with an expression of type 'int'
int *x = 17;
^ ~~
C99在第6.5.4节演员中说明,第4段:
涉及指针的转换,除了6.5.16.1的约束允许的范围外,应通过显式转换来指定。
6.5.16.1是void *
转换为其他指针而不需要强制转换的例外。
C ++规范在第5.4节显式类型转换(强制转换表示法)中说明,第3段:
以下未提及但未由用户明确定义的任何类型转换都是格式错误。
所以你去 - 两种语言都是非法的,但是为了与许多旧软件兼容,很多C编译器都会让你逃脱它。
答案 1 :(得分:2)
是的,虽然许多(所有?)编译器发出警告,但是C中隐含了强制转换。在C ++中,没有从int
到int*
执行隐式转换,因此需要显式转换。
答案 2 :(得分:2)
一直以来,C都有隐式转换 - 根据我的经验,几乎从任何整数类型到任何其他整数类型。 C中的指针是被认为是整数 scalar
类型。
在C ++中,积分类型定义如下:
类型
bool
,char
,char16_t
,char32_t
,wchar_t
以及signed
和unsigned
整数类型统 称为整数类型。 48 整数类型的同义词是整数类型。整数类型的表示 应使用纯二进制数字系统定义数值。 49 [例如:本国际标准 允许2的补码,1的补码和积分类型的带符号幅度表示。 -结束 例子]
可以在C ++中转换为指针类型的唯一整数值是空指针常量,但从技术上讲,转换为prvalue
类型std::nullptr_t
。 (第4.10段)
最后的注释
而不是像这样修复它:
int *ptoi = (int *)17;
考虑添加C ++风格的演员:
int *ptoi = reinterpret_cast<int*>(17);
清楚说明您要调用的转换类型
答案 3 :(得分:1)
编译器会将int *ptoi = 17;
解释为指向位置17(0x00000011)处的整数的变量ptoi。
C只是一种完全不同的语言。它可能看起来像C ++,但事实并非如此。不同的规则适用于这两种语言。
我应该指出,C和C ++都会(据我所知)使它成为指向0x00000011的指针,但C只是抱怨较少,因为分配内存位置在C中是无效的。