在.m和.mm文件中调用.cpp函数,错误

时间:2014-01-13 05:04:25

标签: c++ objective-c mixing

我正在尝试将我自己的小型cpp项目整合到一个大型的Objective-c项目中。我已将自己的项目编译为.dylib文件并添加到大项目中,并包含.h文件。但是为了遵循遗产,我必须从大项目中的.m文件中调用我的函数。

我知道.m文件无法调用cpp函数所以我试过的是将我的cpp .h文件包含在另一个.mm文件中,然后在我的.m文件中将头文件包含到.mm文件中。这就是我所做的:

A.mm(我和标题一起创建了这个文件)

#import "A.h"
#include "mycppfunc.h"
int ParseFile(char * filename)
{
    ....(using cpp functions)
    return 0;
}

A.H

int ParseFile(char* filename);

B.mm(最初在大项目中)

#import "B.h"
#import "A.h"
.... (original codes in B.mm)

B.h

#import "C.h"
....

C.m(最初在大项目中,由于遗留问题,我必须从这里调用我自己的函数)

#import "C.h"
#import "B.h"
....
- (IBAction) call_my_proj: (id) sender
{
    ....
    ParseFile("myfile.txt");
}

C.h

.... (this file is un-changed)

当我编译时,我收到了这个错误:

Implicit declaration of function 'ParseFile' is invalid in C99

任何人都可以帮我解释它出错的地方吗?可能是由于对不同头文件的循环引用(但我无法更改它,因为它影响其他人的代码)。我怎么能摆脱这个错误?任何帮助都非常感谢!感谢。

3 个答案:

答案 0 :(得分:1)

您需要#include "A.h"中的C.m。您在ParseFile()中呼叫C.m

答案 1 :(得分:0)

将所有.m文件的扩展名重命名为.mm。这样你就可以在没有任何包装器的情况下直接调用objective-C类中的cpp函数。

答案 2 :(得分:0)

首先,您需要在A.hC.h中加入C.m

但是,因为A.mm中定义的函数是使用(Obj)C ++编译器编译的,所以您可能需要从C调用它们。您可以使用C linkage执行此操作。然后应该从C.m文件中调用ParseFile()。例如,在头文件中:

extern "C"
{
   int ParseFile(const char *);
}