项目中要大量调用C层代码,涉及到C->OC,OC->C,加入C层代码后大量error,一堆红色真实恐怖,网上搜一下,发现说的都不是很详细,不知道这么简单问题是大牛不屑一顾,还是怎样,于是写了一个简单测试一下,答案是当然可行。记录在此,后面的人就不要在这个坑里花时间了。
deom很简单一个简单sigle模板,文件结构如下
Test.m
#include <stdio.h>
#include <Foundation/Foundation.h>
extern char * testc()
{
char * ret = "Hello World!";
return ret;
}
extern char * testc2oc(id obj)
{
return objc_msgSend(obj, @selector(test2),@"hello,world!OC 1");
}
extern char * testc2oc2(id obj)
{
NSString * ret = @"Hello World!OC 2";
return [ret cStringUsingEncoding:NSUTF8StringEncoding];
}
TestHelp.h文件
#import <Foundation/Foundation.h>
@interface TestHelp : NSObject
-(char *)test2;
@end
TestHelp.m文件
#import "TestHelp.h" @implementation TestHelp -(char *)test2 { NSString *ret = @"hello world from oc"; return [ret cStringUsingEncoding:NSUTF8StringEncoding]; } @end
后面就是VC的调用代码了- (IBAction)testC:(id)sender { char * ret = testc(); _result.text = [NSString stringWithUTF8String:ret]; } - (IBAction)testOc:(id)sender { // char * ret =testc2oc([[TestHelp alloc]init]); char *ret =testc2oc2(nil); _ocResult.text = [NSString stringWithUTF8String:ret]; }
在vc 中有需要加入下面代码,不然vc 怎么知道呢
extern char * testc(); extern char * testc2oc(id obj); extern char * testc2oc2(id obj);
到这里就调用成功了
这里有个问题,就是Test.m ,不能用Test.c。后果就是一堆的系统库头文件报错;