没有预期返回类型的返回路径存在时没有编译时错误

时间:2012-05-23 23:04:06

标签: java c

我想知道为什么以下代码在编译期间不会抛出错误? :

#include <stdio.h>
char * func (char *);

int main()
{
    func("TINFO");
    func("INFO");
}

char * func(char * str)
{
    if (str[0] == 'T')
    return str + 1;
}

您会看到该函数的返回路径未返回char *

但类似的Java代码会引发编译时错误。

使用的编译器:

gcc (Ubuntu 4.4.3-4ubuntu5) 4.4.3

2 个答案:

答案 0 :(得分:3)

您所要做的就是提高编译器的“警告”级别。

实施例

$ gcc -o x x.c
  <= DEFAULT: No warnings, no errors

$ gcc -Wall -pedantic -o x x.c
x.c: In function `main':
x.c:14: warning: control reaches end of non-void function
x.c: In function `func':
x.c:24: warning: control reaches end of non-void function

答案 1 :(得分:2)

根据C标准6.9.1.12,只有当调用者使用返回值时,到达函数末尾才是未定义的行为

  

如果到达了终止函数的},并且调用者使用了函数调用的值,则行为未定义。

这就是编译器必须让这段代码编译的原因。