2

我想知道为什么下面的代码在编译过程中不会抛出错误?:

#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
4

2 回答 2

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
于 2012-05-23T23:09:31.947 回答
2

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

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

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

于 2012-05-23T23:21:38.687 回答