为什么我在这个小样本中得到“之前没有功能原型”?

时间:2011-09-04 06:52:34

标签: 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, World!");

    [pool drain];
    return 0;
}

int littleFunction()
{
    return 0;
}

使用这段代码我得到一个“没有以前的函数原型”警告littleFunction但是你可以看到在main之前有一个声明。这有什么不对?看起来编译器无法将声明与函数实现匹配。

如果我这样改变:

int littleFunction(void)

它完美无缺。 我正在使用最新的Xcode 4

2 个答案:

答案 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找到了一个全局函数定义而没有看到该函数的原型。如果函数在多个文件中使用,那么在某个头文件中应该有一个原型。这可以防止功能及其用途不同步

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