【Xcode学C-6】宏定义#define、条件编译#if、文件包含、内部外部函数以及typedef的用法
2014-10-09 21:31
676 查看
一、宏定义
(1)宏定义一般就是在开头用#define *** ***,一般就是做一个简单替换,后面没有分号。
(2)宏定义的变量一般都是大写,或者在所有宏定义变量前面添加统一的前缀。
(3)宏定义是预处理的一种,就是在代码被编译成0和1之前做得那个操作。
(4)还有一种是带有参数的宏定义,如#define SUM(v1+v2) v1+v2(括号于后面之间有空格),在后面应用的时候SUM(a+b),其实就被替换成a+b了,相当于有参数的运算。
(5)宏定义效率比函数高。做简单地运算用宏定义,复杂的还是用函数。
二、条件编译(也是预处理的一种)
(1)一般条件语句,虽然满足条件只执行一部分代码,另一部分因为不满足条件不被执行,但是所有代码都会被编译,所以文件会变大。
(2)条件编译就是,满足条件的就编译,不满足条件的就不编译,文件大小得到控制,但明显不利于阅读。
(3)主要用法,就是定义一个宏变量,取不同值表示在开发阶段和发布阶段分别编译,比如开发阶段是网址****/test,发布阶段是****/public,所以可以定义一个宏变量,在开发的时候用test,发布的时候把test换成public即可,而不用手动修改。
#define A 1
int main(int argc, const char * argv[]) {
#if A==1
printf("hello");
#elif A==2
printf("world");//只编译这一句,其他的相当于不存在
#else
printf("hi");
#endif
return 0;
}
三、文件包含
(1)#include "***.h",.h文件不会被编译,仅仅是被拷贝过来。可以重复导入,但是我们在C语言里面可以用上面的条件编译防止重复引导,即书写“如果没有一个宏变量,那么创建这个宏变量,顺便执行下面代码”,这样在重复导入的时候,后面的导入也会判断发现已有宏变量,所以就能防止。
(2)对于OC语言,已经自动内嵌防止重复导入的功能,不用用户操心。
(3)头文件不能相互引用,只能单向的。
四、函数种类
(1)函数分为内部函数和外部函数,默认的所有函数都是外部函数,即本文件和其他文件都能调用,一般函数前面的extern被省略了。不能有同名的外部函数。
(2)内部函数前面需要有static,内部函数只能被本文件调用,可以通过调用其他文件的外部函数(调用内部函数)来调用其他文件的内部函数。内部函数可以同名。
注意:全局变量也分为内部变量和外部变量两种,同理,外部的那种其他文件也能访问,默认情况下都是外部的那种。关键字依然是static和extern。
五、typedef
(1)给类型名称取个别名。如typedef int myInt,然后就可以用myInt定义变量了。更实用的在于定义结构体变量时候,平时都是struct person p1;我们可以用typedef struct person pp,用pp代替一长串,以后再书写可以简化成pp p1;。
(2)同理,定义枚举变量也是比较复杂,可以用以上方法简化。
(3)还可以为指向函数和结构体的指针取别名。
(3)typedef与#define的区别
#define STRING char*
typedef char* string1;
int main(int argc, const char * argv[]) {
//#define和typedef的区别,在定义多个变量时,宏变量#define仅仅是替换,会产生问题
//下面一句相当于char *str1;和char str2;
STRING str1,str2;
//下面一句相当于char *str3和char *str4;
string1 str3,str4;
return 0;
}
(1)宏定义一般就是在开头用#define *** ***,一般就是做一个简单替换,后面没有分号。
(2)宏定义的变量一般都是大写,或者在所有宏定义变量前面添加统一的前缀。
(3)宏定义是预处理的一种,就是在代码被编译成0和1之前做得那个操作。
(4)还有一种是带有参数的宏定义,如#define SUM(v1+v2) v1+v2(括号于后面之间有空格),在后面应用的时候SUM(a+b),其实就被替换成a+b了,相当于有参数的运算。
(5)宏定义效率比函数高。做简单地运算用宏定义,复杂的还是用函数。
二、条件编译(也是预处理的一种)
(1)一般条件语句,虽然满足条件只执行一部分代码,另一部分因为不满足条件不被执行,但是所有代码都会被编译,所以文件会变大。
(2)条件编译就是,满足条件的就编译,不满足条件的就不编译,文件大小得到控制,但明显不利于阅读。
(3)主要用法,就是定义一个宏变量,取不同值表示在开发阶段和发布阶段分别编译,比如开发阶段是网址****/test,发布阶段是****/public,所以可以定义一个宏变量,在开发的时候用test,发布的时候把test换成public即可,而不用手动修改。
#define A 1
int main(int argc, const char * argv[]) {
#if A==1
printf("hello");
#elif A==2
printf("world");//只编译这一句,其他的相当于不存在
#else
printf("hi");
#endif
return 0;
}
三、文件包含
(1)#include "***.h",.h文件不会被编译,仅仅是被拷贝过来。可以重复导入,但是我们在C语言里面可以用上面的条件编译防止重复引导,即书写“如果没有一个宏变量,那么创建这个宏变量,顺便执行下面代码”,这样在重复导入的时候,后面的导入也会判断发现已有宏变量,所以就能防止。
(2)对于OC语言,已经自动内嵌防止重复导入的功能,不用用户操心。
(3)头文件不能相互引用,只能单向的。
四、函数种类
(1)函数分为内部函数和外部函数,默认的所有函数都是外部函数,即本文件和其他文件都能调用,一般函数前面的extern被省略了。不能有同名的外部函数。
(2)内部函数前面需要有static,内部函数只能被本文件调用,可以通过调用其他文件的外部函数(调用内部函数)来调用其他文件的内部函数。内部函数可以同名。
注意:全局变量也分为内部变量和外部变量两种,同理,外部的那种其他文件也能访问,默认情况下都是外部的那种。关键字依然是static和extern。
五、typedef
(1)给类型名称取个别名。如typedef int myInt,然后就可以用myInt定义变量了。更实用的在于定义结构体变量时候,平时都是struct person p1;我们可以用typedef struct person pp,用pp代替一长串,以后再书写可以简化成pp p1;。
(2)同理,定义枚举变量也是比较复杂,可以用以上方法简化。
(3)还可以为指向函数和结构体的指针取别名。
(3)typedef与#define的区别
#define STRING char*
typedef char* string1;
int main(int argc, const char * argv[]) {
//#define和typedef的区别,在定义多个变量时,宏变量#define仅仅是替换,会产生问题
//下面一句相当于char *str1;和char str2;
STRING str1,str2;
//下面一句相当于char *str3和char *str4;
string1 str3,str4;
return 0;
}
相关文章推荐
- C语言学习11:typedef和define区别,头文件的使用以及 <>和“”区别,宏定义中#和##的用法,条件编译,gcc和c99中宏定义使用printf和sprintf,条件编译避免头文件包含
- 6.C++ 宏定义、文件包含、条件编译、内部函数和外部函数
- 编译预处理--#include包含指令, #define宏定义指令, #if条件编译指令
- IOS开发---C语言-㉑预处理指令:宏定义、条件编译、文件包含
- 宏定义,条件编译以及函数指针
- 预处理(宏定义、文件包含、条件编译)
- Hive 文件格式 & Hive操作(外部表、内部表、区、桶、视图、索引、join用法、内置操作符与函数、复合类型、用户自定义函数UDF、查询优化和权限控制)
- 三种预处理功能 : 宏定义 --文件包含 -- 条件编译 import include 常用c/c++库
- 条件编译#define、#undef、#if、#elif、#elif defined、#elif !defined 、#endif用法
- c语言学习--宏定义、条件编译、文件包含(就是include)
- 预处理 之 宏定义、文件包含、条件编译
- Makefile编译目录下多个文件以及函数wildcard用法
- 15-预处理指令1-宏定义、条件编译、文件包含
- 《黑马程序员》预处理指令(宏定义、条件编译、文件包含)(C语言)
- C++编译预处理:宏定义指令、文件包含指令和条件编译指令
- 【黑马程序员】iOS学习之路——C语言之宏定义、条件编译和条件包含及typedef
- 多文件程序(extern声明、内部函数、外部函数、外部变量、文件包含)
- 预处理(宏定义、文件包含、条件编译)
- 预处理指令—宏定义,条件编译,文件包含
- C++编译预处理:宏定义指令、文件包含指令和条件编译指令