我有一个非常简单的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;
}
使用这段代码我得到一个“没有以前的函数原型”警告littleFunction但是你可以看到在main之前有一个声明。这有什么不对?看起来编译器无法将声明与函数实现匹配。
如果我这样改变:
int littleFunction(void)
它完美无缺。 我正在使用最新的Xcode 4
答案 0 :(得分:35)
在C中,int littleFunction();
不是真正原型。它没有指定函数接受多少(或哪种类型)参数。
C99中的实际措辞见§6.7.5.3第14项:
标识符列表仅声明函数参数的标识符。函数声明符中的空列表是该函数定义的一部分,指定该函数没有参数。函数声明符中的空列表不属于该函数的定义,指定不提供有关参数数量或类型的信息强> 124
脚注在未来语言方向中引用此部分:
6.11.6函数声明符
使用带有空括号的函数声明符(不是prototype-format参数 类型声明者)是一个过时的功能。
(注意:这仍然存在于我所拥有的C11草案中(n1570)。)
回到§6.7.5.3,第10项:
类型为
void
的未命名参数的特殊情况,作为列表中的唯一项目 指定该函数没有参数。
因此,如果要对不带参数的函数进行原型设计,则必须明确指定int foo(void);
。 Objective-C具有相同的规则。
答案 1 :(得分:2)
我认为问题在于您没有对“全局功能使用”静态“。
请参阅以下内容:
之前没有`foo'的原型
这意味着GCC找到了一个全局函数定义而没有看到该函数的原型。如果函数在多个文件中使用,那么在某个头文件中应该有一个原型。这可以防止功能及其用途不同步
如果该功能仅在此文件中使用,请将其设为静态,以确保它永远不会在此文件之外使用并记录它是本地函数