为什么LLVM会抱怨缺少函数原型?

时间:2011-09-28 15:31:46

标签: c++ llvm compiler-warnings

LLVM 2.1有一个选项,可以为“缺少函数原型”发出警告。启用后,警告会抱怨这样的文件:

double square( double d )
{
    return d*d;
}
void main()
{
    // ...
}

函数“square”将触发警告,因为它是在未声明(prototyped)的情况下定义的。你可以消除警告:

double square( double d );
double square( double d )
{
    return d*d;
}
void main()
{
    // ...
}

我用C ++编程了二十年,我从未见过像这样的警告。这似乎对我没用。

默认情况下,在Xcode 4.1中的新Mac控制台项目(至少)中启用此警告。显然有人发现它首先实现它然后默认启用它是有用的。

为什么这是一个有用的警告?为什么LLVM会将其作为选项?为什么Xcode上默认启用该选项?

3 个答案:

答案 0 :(得分:8)

编译器使用原型声明来匹配函数定义的类型 如果你在头文件(接口)文件和源文件中的实现中编写原型,那么这个警告(通过强制你提供一个声明,有效)会阻止你在函数定义不同的情况下发出拼写错误在声明中。

但是,如果没有这样的警告,您会在链接时收到错误。人们可能最终想知道实际问题是什么(链接错误的原因有很多)。

编译阶段的警告比链接错误更好地指示错误。

答案 1 :(得分:2)

如果可以确保每个函数都可以从某个标题中看到,或者是静态的。

我有两个文件链接在一起的情况,即使它们都没有使用相同的头文件。

举个例子:

int test()
{
    return 0;
}

如果没有标题,您可以使用第二个文件:

extern int test();
test();

如果你正在编写一个库,这个警告可能会告诉你有人可能正在使用这个函数,即使它们不应该这样,因为这个函数没有标题。它们应该被标记为静态。

答案 2 :(得分:0)

“int test()”的原型应为“int test( void )”然后就可以了。

相关问题