以下代码中的'const'导致了什么行为,特别是强制转换:
const void *foo()
{
void *bar = NULL;
// Assign bar to some address here.
return (const void *)bar;
}
演员是否必要?编译器发出一个警告,表明类型与返回类型不匹配,除非我执行强制转换,但结果行为是否有任何不同?
答案 0 :(得分:6)
演员表不是必需的,甚至是无用的。如果你不投,C不需要任何警告。
如果需要char *
返回值,您可以返回const char *
。
对于其他类型也是如此:当预期T *
时,您可以返回const T *
。
C表示return
声明:
(C99,6.8.6.4p3)“如果表达式的类型与其出现的函数的返回类型不同,则转换该值,就好像通过赋值给具有函数返回类型的对象一样。 “
您可以将char *
分配给const char *
(请注意,相反的情况无效)。
C表示指针分配:
(C99,6.5.16.1p1)“以下之一应该成立:[...]两个操作数都是指向兼容类型的限定或非限定版本的指针,左边指向的类型具有以下所有限定符:右边指出的类型; [...]“
答案 1 :(得分:0)
您将函数定义为const void *foo()
,声明您将返回const pointer
。因此,编译器期望返回类型为const void *
因此演员。
但是,当您计算指针的值时,您正在违反合同 - 您实际上正在返回void *
所以我建议正确的更改是修改声明以删除const
(从而消除了对演员的需要)
答案 2 :(得分:-1)
如果没有强制转换,则返回一个应该是const的指针。所以返回类型不匹配。调用者接收const void *无论如何(因为这是返回类型),所以通过执行强制转换,你摆脱了编译器警告,但你必须确保在执行强制转换时,你知道你在做什么,因为你告诉编译器(我知道我在做什么,不要警告我)。