1

以下代码中的“const”会导致什么行为,特别是演员表:

const void *foo()
{
   void *bar = NULL;

   // Assign bar to some address here.

   return (const void *)bar;
}

演员阵容有必要吗?编译器会发出警告,指出类型与返回类型不匹配,除非我执行强制转换,但结果行为有什么不同吗?

4

3 回答 3

6

演员表不是必需的,甚至是无用的。如果您不强制转换,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)“以下之一应成立:[...] 两个操作数都是指向兼容类型的合格或非合格版本的指针,并且左侧指向的类型具有所指向类型的所有限定符向右;[...]"

于 2012-10-26T15:27:21.260 回答
0

您正在定义函数,const void *foo()它声明您将返回一个const pointer. 因此编译器期望返回类型为const void *

因此演员阵容。

但是,当您计算指针的值时,您违反了合同-您实际上是在返回void *,所以我建议正确的更改是修改声明以删除const(从而消除对演员表的需要)

于 2012-10-26T19:40:40.797 回答
-1

如果没有强制转换,您将返回一个应该是 const 的指针。所以返回类型不匹配。调用者收到一个 const void * 不管(因为那是返回类型),所以通过执行强制转换,您可以摆脱编译器警告,但是您必须确保在执行强制转换时,您知道自己在做什么,因为你在告诉编译器(我知道我在做什么,不要警告我)。

于 2012-10-26T15:27:49.193 回答