函数的隐式声明 - C99

36

我目前正在使用 Xcode 4,在我的 .pch 文件中,我有这个宏:#define localize(s) NSLocalizedString((s), nil)
当我尝试在某些 .m 文件中使用此宏时,我收到此警告:Implicit declaration of function 'localize' is invalid in C99

这段代码能够编译通过,但是我该如何修复它以避免警告?


我无法重现这个问题,它编译和运行都很好,没有警告。 - Lio
似乎是XCode的一个漏洞...我想是4.0.2版本。4.2测试版运行良好。 - Misa
5个回答

51

当我将NSLog替换为DLog时,我遇到了这个问题。我愚蠢地包含了

#define DLog(...) NSLog(...

语句,所以我最终得到了

#define DLog(...) DLog(...

这导致了警告和链接器错误。


34

隐式函数声明是指在第一次使用时编译器看到的函数调用(而不是首先看到原型或函数定义的函数声明)。

显然,您的代码使用了localize(foo),但宏定义未被视为可见。可能的原因是:您忘记了#include包含localize宏的文件,或者头文件的预编译出现了问题,没有包括localize宏,因此它未被展开。


3
如果宏在项目的前缀头文件中定义,那么这表明Xcode存在一个错误,因为该头文件应该被预编译并且对所有编译单元可用(例如项目中的每个.m文件)。顺便说一下,我在Xcode 4.4.1中偶尔还会遇到这个bug,但是退出并重新启动Xcode就可以解决。 - Mason
2
可能可以归类为“头文件的预编译出了问题”。由于工具中存在错误,任何事情都有可能发生。 - Jens
我在Xcode 5中见过这种情况。最安全的方法是在显示错误的文件中简单地包含相关的头文件,以消除警告消息。 - JaredH

2

我遇到的另一个“愚蠢”的错误是我的DLog在iOS目标的前缀头文件中定义,因此我不得不将其复制到OSX目标的前缀头文件中...


1
我之所以遇到这个问题,是因为我不小心像这样导入了CocoaLumberjack:
#import <CocoaLumberjack/DDLog.h>

显然,CocoaLumberjack团队进一步模块化了代码;像DDLogError这样的宏现在在自己的头文件中单独定义。
我用这个替换了导入语句,错误消失了:
#import <CocoaLumberjack/CocoaLumberjack.h>

1
在我的情况下,只有一个文件出现了这个错误。结果发现我将它添加到了项目的测试目标成员资格中(在右侧的文件检查器中)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接