C与C++与OC的混编

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}

猜你喜欢

转载自blog.csdn.net/amy260231120/article/details/52622579
今日推荐