版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/amy260231120/article/details/52622579
C与OC
首先创建一个点.m文件
// main.m
#import <Foundation/Foundation.h>
#import "fileC.h"
int main(int argc, const char * argv[]) {
func1();
return 0;
}
然后创建一个C文件
//fileC.h
#ifndef fileC_h
#define fileC_h
#include <stdio.h>
void func1();
#endif /* fileC_h */
// fileC.c
#include "fileC.h"
void func1() {
printf("C");
}
运行,(竟然通过了0.0)
结论:
.m文件其实就是.c文件,OC是完全兼容C语言的,他就是C改变过来的。
只是需要一个框架来翻译成c语言
.m使用.c时候,直接调用.c的库就好了
使用情况
当需要用到.c时候(比如需要用到第三方库用C语言的时候)的时候),直接调用即可
不存在.c调用.m的情况:在.m上是用做苹果开发,既然如此可以直接把.c用OC编
C与C++
直接在刚刚工程中创建一个.cpp文件
// 写一个C++函数
void func2() {
func1();
printf("C++");
}
// 记得把main函数改了,调用func2();
报错了把。。。报错了把。。。。报错了把。。。
“func1()”, referenced from:
_func2 in fileC++.o
ld: symbol(s) not found for architecture x86_64
func1()找不到嘛,说明C++性质的函数是不能直接调用C性质的函数的,
func2() (main中)就更加找不到了嘛
解决办法:
// 定义为一个C性质函数
extern "C" 函数定义
// 在C++性质的文件中声明一个C性质的函数
extern "C" {
函数声明
}
在.h文件中:
#ifdef __cplusplus
extern "C" {
// 如果被C++性质的文件包含了,则需要这样声明这个函数,这样他会从C性质的文件中寻找
#endif
#ifdef __cplusplus
void func1(); //如果是被C性质文件包含,则直接声明,不执行ifdef的内容
}
#endif
注意到__cplusplus,这个宏是只定义在C++中的宏,在C语言中不存在,所以我们可以根据这个宏判断这个头文件被哪种性质的文件包含
在.cpp文件中 ,需要将要调用c性质函数的函数声明为C性质函数
extern "C" void func2() { // 现在这就是个C性质的函数了,可以在C性质文件中使用了。
func1(); // 这是C性质函数
printf("C++");
}
总结下:
在C语言中使用C++函数,需要在定义C++函数时, extern "C" + 函数定义
,并且在声明时候,extern "C"{函数声明}
OC与C++
这时候,我们就需要一个适配文件.mm文件
/*
.mm文件的性质
1.C++性质的文件(默认书写为C++性质的函数)
如果关键字(static, auto)冲突,以C++为主
2.同时支持OC和C++语法
3.语法之间相互独立
4.类之间不可交叉继承
5.类之间不可交叉创建
6.语法可以交叉嵌套
7.自定义类型之间不可交叉强转
*/
// main.mm
#import <Foundation/Foundation.h>
#import <iostream>
#import "file1.hpp"
@class Cl2; // 如果要声明OC的类就用OC的声明方式
class Cl1 {
private:
int member1;
public:
Cl1(const int member1): member1(member1) {}
int getMember1() {
return member1;
}
};
class Cl1;
@interface Cl2 : NSObject {
Cl1 *cl1;
}
@property (nonatomic, assign) int member;
- (instancetype) initWithCl1:(Cl1 &)cl1 AndMember:(int)member;
@end
@implementation Cl2
- (void)show {
NSLog(@"%d", self.member);
}
- (instancetype) initWithCl1:(Cl1 &)cl1 AndMember:(int)member {
self = [self init];
self -> cl1 = &cl1;
self.member = member;
return self;
}
@end
int main(int argc, const char * argv[]) {
Cl1 c1(3);
Cl2 *c2 = [[Cl2 alloc] init];
c2.member = c1.getMember1();
[c2 show];
Cl1 c3([c2 member]);
NSString *str = @"Hello";
std::cout << std::string([str UTF8String]) << std::endl;
auto c4 = [[Cl2 alloc] initWithCl1:c1 AndMember:6];
return 0;
}