2012-02-23 54 views
5

以下test.c程序为什么GCC针对未声明的功能发出警告不一致?

int main() { 
    dummySum(1, 2); 
    return 0; 
} 

int dummySum(int a, int b) { 
    return a + b; 
} 

...当gcc -o test test.c编译,而下面的人做不产生任何警告:

int main() { 
    dummySum(1, 2); 
    return 0; 
} 

void dummySum(int a, int b) { 
    a + b; 
} 

为什么?

+0

不是。我也是这么想的。 'dummy'的'int'和'void'返回类型。 – mattjgalloway 2012-02-23 15:45:44

+1

未声明函数的默认返回类型是int。当你将它声明为void时,它找不到任何匹配的函数。我相信如果你使用更强的警告检查(例如-Wall),你会在任何情况下都会收到警告。 – Joe 2012-02-23 15:46:02

+1

在第一个帖子中是一样的,你是对的。我编辑了这篇文章。对不起 – 2012-02-23 15:46:22

回答

8

当遇到未声明函数,编译器假定接受给定数量的参数(我认为)返回int(这部分我敢肯定的)功能。你的第二个没有,所以你得到重新定义警告。我相信,基于前面的一个非常快速的扫描,C99(PDF link)删除了这一点。尽管GCC仍然允许他们(带有警告),但这并不令人惊讶。我无法想象有多少代码就开始无法编译...


推荐使用-Wall(打开所有的警告),所以你得到巨大的附加信息的数量(您可以在当关闭特定的警告有一个真的很好的理由,无论你在做什么,如果需要生成)。

+0

在C99中删除了'implicit int',所以在严格的C99模式或C11模式下,它不应该编译IMO。然而,海湾合作委员会编译它,只是吐出一个警告(两者)。 – 2012-02-23 17:05:15

+0

@DanielFischer:有趣!实际上,我只是看着C99,我认为它比这更进一步:它完全消除了隐式函数声明。 (有趣的是,前言分别列出了两个项目,“删除隐式”int“”和“删除隐式函数声明”)。我怀疑“implicit'int'”位指的是一个声明的函数,但根本没有任何返回类型。 – 2012-02-23 17:39:12

2

函数在声明之前无法使用。当一个函数声明是不可见的,实施在C89假定函数:

  • 需要的参数的指定(但固定的)数目

  • 返回int

这被称为隐式函数声明

在C99中,函数的隐式声明已经被删除,并且实现可以自由地拒绝翻译源代码。

相关问题