iOS- .h .m .mm .cpp文件
Posted MinggeQingchun
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS- .h .m .mm .cpp文件相关的知识,希望对你有一定的参考价值。
在Xcode中我们会发现以 .h .m .mm .cpp为后缀名的文件,下面分别解释下这些文件的作用意义
1、.h:头文件。头文件包含类,类型,函数和常数的声明。
2、.m:源代码文件。这是典型的源代码文件扩展名,可以包含Objective-C和C代码。
3、.mm:源代码文件。带有这种扩展名的源代码文件,除了可以包含Objective-C和C代码以外还可以包含C++代码。仅在你的Objective-C代码中确实需要使用C++类或者特性的时候才用这种扩展名
4、.cpp:只能编译C++(cpp文件是用C++语言编写的源代码文件格式)
5、Objective-C 和 C、C++ 如何混用
(1)OC的编译器处理后缀为 .m的文件时,可以识别 OC和 C的代码,
处理 .mm文件可以识别OC,C, C++代码,
但 .cpp文件必须只能用C++代码,而且cpp文件include的头文件中,也不能出现OC的代码,因为cpp只是cpp
(2)在 .mm文件中混用 cpp文件直接使用即可,所以OC混cpp不是问题
(3)在 cpp中混用OC其实就是使用OC编写的模块是我们想要的。
(4)如果模块以类实现,那么要按照cpp class的标准写类的定义,头文件中不能出现OC的代码,包括#import cocoa的。实现文件中,即类的实现代码中可以使用OC的东西,可以import,只是后缀是mm。
(5)如果模块以函数实现,那么头文件要按 C的格式声明函数,实现文件中,C++函数内部可以用OC,但后缀还是 mm或 m。
总结:只要cpp文件和cpp include的文件中不包含OC的东西就可以用了,cpp混用OC的关键是使用接口,而不能直接使用 实现代 码,实际上cpp混用的是OC编译后的o文件,这个东西其实是无差别的,所以可以用OC的编译器支持cpp
.m和.mm的区别是告诉gcc在编译时要加的一些参数。当然.mm还可以命名成.m,但在编译时要手动加参数(麻烦)
6、#import 和 #include,@class区别
当你需要在源代码中包含头文件的时候,你可以使用标准的#include编译选项,但是Objective-C提供了更好的方法。#import选项和#include选项完全相同,只是它可以确保相同的文件只会被包含一次。Objective-C的例子和文档都倾向于使用#import。
#import是Objective-C导入头文件的关键字,#include是C/C++导入头文件的关键字,使用#import头文件会自动只导入一次,不会重复导入,相当于#include和#pragma once;@class告诉编译器某个类的声明,当执行时,才去查看类的实现文件,可以解决头文件的相互包含;#import<>用来包含系统的头文件,#import“”用来包含用户头文件。
注意#import或#include的位置要在 .m 或 .mm文件里,如果在 .h头文件里是没用的
ios中还有其他文件类型,可自行查阅参考,这里不做详述
.o 文件(目标文件)
.a 静态库文件。其实就是N个.o文件的集合
.dylib: 动态库文件
.framework(系统的.framework是动态库,自己建立的.framework是静态库)
(1)库
库是共享程序代码的方式,一般分为静态库和动态库。
(2)静态库与动态库的区别
静态库:链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝。
动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存。
(3)iOS里静态库形式?
.a和.framework
(4)iOS里动态库形式?
.dylib和.framework
系统的.framework是动态库,我们自己建立的.framework是静态库。
(5)a与.framework区别
.a是一个纯二进制文件,.framework中除了有二进制文件之外还有资源文件。
.a文件不能直接使用,至少要有.h文件配合,.framework文件可以直接使用。
.a + .h + sourceFile = .framework。
以上是关于iOS- .h .m .mm .cpp文件的主要内容,如果未能解决你的问题,请参考以下文章