0

我正在尝试从 C 代码调用在 Obj-C 中实现的方法,如下所示:

// MainViewController.m

- (void)Test
{
    [self outputLine:@"Called from MyCode.c"];
}
.
.
.
cFunc(id param);
.
.
.

// 我的代码.c

void cFunc(id param)
{
    [param Test]; // compilation error: Parse issue: Expected expression
}

我想这是因为 MainViewController 没有在 MyCode.c 中声明,但是当我 #include MainViewController.h 时,我得到大量其他错误,表明我完全错了......我应该如何正确处理它?

TIA

4

3 回答 3

4

您应该将该文件编译MyCode.c为 Objective-C。Objective-C 是 C 的超集,但反过来却不是这样。如果您打算将其编译为 C,则不能将 Objective-C 代码与“纯 C”代码穿插。

于 2013-07-11T13:47:51.943 回答
0

只需将您的 myCode.c 更改为 myCode.m :P

不要害怕将 C 代码放在 Objective-C 文件中。

于 2013-07-12T00:32:16.710 回答
0

检查:使用 objc_msgSend 调用具有命名参数的 Objective C 函数

void cFunc(id param) {
    objc_msgSend(param, sel_getUid("Test"));
}

但是,根据上面的链接,如果您的参数不适合寄存器(即浮点数、结构、等等),这有几个原因是危险的。

这样做的公认方法是强制转换 objc_msgSend:

void cFunc(id param) {
    // Now let's pretend that you want to send someFloat to your method

    void (*objc_msgSendTyped)(id self, SEL _cmd, float bar) = (void*)objc_msgSend;

    float someFloat = 42.f;
    objc_msgSendTyped(param, sel_getUid("Test"), someFloat);
}
于 2013-07-11T13:53:33.930 回答