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上默认启用该选项?
答案 0 :(得分:8)
编译器使用原型声明来匹配函数定义的类型 如果你在头文件(接口)文件和源文件中的实现中编写原型,那么这个警告(通过强制你提供一个声明,有效)会阻止你在函数定义不同的情况下发出拼写错误在声明中。
但是,如果没有这样的警告,您会在链接时收到错误。人们可能最终想知道实际问题是什么(链接错误的原因有很多)。
编译阶段的警告比链接错误更好地指示错误。
答案 1 :(得分:2)
如果可以确保每个函数都可以从某个标题中看到,或者是静态的。
我有两个文件链接在一起的情况,即使它们都没有使用相同的头文件。
举个例子:
int test()
{
return 0;
}
如果没有标题,您可以使用第二个文件:
extern int test();
test();
如果你正在编写一个库,这个警告可能会告诉你有人可能正在使用这个函数,即使它们不应该这样,因为这个函数没有标题。它们应该被标记为静态。
答案 2 :(得分:0)
“int test()”的原型应为“int test( void )”然后就可以了。