mta*_*med 25 c c++ pointers casting
我相信在下面的代码中,C"自动转换为17 int *",正如有人最近指出的那样(但没有说明原因),这是错误的.
int *ptoi = 17; // I assumed that 17 is being automatically casted to int *
Run Code Online (Sandbox Code Playgroud)
我知道如果我在C++中做同样的事情,我会收到一个错误invalid conversion from int to int *.但是,如果我在C++中执行以下操作,它可以正常工作:
int *ptoi = (int *)17;
Run Code Online (Sandbox Code Playgroud)
这些是我认为在C中,铸造是隐含的原因.
有人可以解释为什么,在C++中,我必须使用它,但在C中,它工作正常吗?
Car*_*rum 17
从整数到没有强制转换的指针的转换在C中也是非法的.大多数编译器会让你逃脱它.Clang发出警告:
example.c:5:8: warning: incompatible integer to pointer conversion initializing
'int *' with an expression of type 'int'
int *x = 17;
^ ~~
Run Code Online (Sandbox Code Playgroud)
C99在第6.5.4节演员操作员第4段中说:
除了6.5.16.1的约束允许之外,涉及指针的转换应通过显式转换来指定.
6.5.16.1是void *转换为其他指针而不需要强制转换的例外.
C++规范在第5.4节显式类型转换(强制转换表示法)第3段中说明:
下面未提及且未由用户明确定义的任何类型转换都是错误的.
所以你去 - 两种语言都是非法的,但为了与许多旧软件兼容,很多C编译器都会让你逃脱它.
| 归档时间: |
|
| 查看次数: |
4504 次 |
| 最近记录: |