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

Tal*_*ode 15 xcode objective-c

我有一个非常简单的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;
}
Run Code Online (Sandbox Code Playgroud)

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

如果我这样改变:

int littleFunction(void)
Run Code Online (Sandbox Code Playgroud)

它完美地运作.我正在使用最新的Xcode 4

Mat*_*Mat 36

在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具有相同的规则.


bas*_*ker 7

我认为问题在于您没有对全局函数使用“静态” 。

请参考以下内容:

`foo' 没有以前的原型

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

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