Objective c 为什么我会得到;“没有以前的功能原型”;在这个小样本里?

Objective c 为什么我会得到;“没有以前的功能原型”;在这个小样本里?,objective-c,xcode,Objective C,Xcode,我有一个非常简单的Objective-C样本 #import <Foundation/Foundation.h> int littleFunction(); int main (int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; // insert code here... NSLog(@"Hello, Wo

我有一个非常简单的Objective-C样本

#import <Foundation/Foundation.h>

int littleFunction();

int main (int argc, const char * argv[])
{

    NSAutoreleasePool * pool 
    = [[NSAutoreleasePool alloc] init];

    // insert code here...
    NSLog(@"Hello, World!");

    [pool drain];
    return 0;
}

int littleFunction()
{
    return 0;
}
它工作得很好。
我正在C中使用最新的Xcode 4,
int littleFunction()并不是一个真正的原型。它没有指定函数接受多少(或什么类型的)参数

C99中的实际措辞见§6.7.5.3第14项:

标识符列表仅声明函数参数的标识符。作为函数定义一部分的函数声明符中的空列表指定该函数没有参数。函数声明器中的空列表不属于该函数定义的一部分,它指定不提供有关参数数量或类型的信息。124

脚注在未来的语言说明中提及本节:

6.11.6函数声明器 使用带空括号的函数声明符(不是原型格式参数 类型声明器)是一种过时的功能

(注:这仍然存在于我拥有的C11草案(n1570)中。)

回到§6.7.5.3第10项:

作为列表中唯一项的
void
类型的未命名参数的特殊情况 指定函数没有参数


因此,必须显式指定
intfoo(void)如果您想原型化一个不带参数的函数。Objective-C具有相同的规则。

我认为问题在于,您没有将“static”用于全局函数

请参阅以下资料:

“foo”没有以前的原型

这意味着GCC在没有看到函数原型的情况下找到了全局函数定义。如果一个函数在多个文件中使用,那么在某个头文件中应该有它的原型。这可以防止函数及其使用不同步


如果该函数仅在该文件中使用,请将其设置为静态,以确保它永远不会在该文件之外使用,并记录它是本地函数

,这才是真正的答案。
int littleFunction(void)