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