C const返回类型函数

时间:2012-10-26 15:23:33

标签: c function return const

以下代码中的'const'导致了什么行为,特别是强制转换:

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

   // Assign bar to some address here.

   return (const void *)bar;
}

演员是否必要?编译器发出一个警告,表明类型与返回类型不匹配,除非我执行强制转换,但结果行为是否有任何不同?

3 个答案:

答案 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 *无论如何(因为这是返回类型),所以通过执行强制转换,你摆脱了编译器警告,但你必须确保在执行强制转换时,你知道你在做什么,因为你告诉编译器(我知道我在做什么,不要警告我)。