C语言-07-预处理、typedef、static和extern
2015-08-10 20:57
253 查看
预处理
1> 使用注意以#开头
在代码被翻译成0和1之前执行
预处理指令可以出现在任何位置
作用域是从编写指令那一行开始到文件结束
2> 宏定义
基本使用
① 使用#define定义 ② 宏定义常常用于替换常量,提高代码的可重用性 ③ 宏名一般大写 ④ 宏定义后边没有分号
有参数的宏
① #define fun(a, b) a + b,定义两个数相加的宏 ② 通过fun(a, b)来调用这个宏 ③ 宏定义只是纯粹的代码替换,在编译时调用 ④ 在定义带参数的宏时,尽量为每个参数和最后的结果都加上括号
示例
#include <stdio.h> //定义带参数的宏实现两个数的乘积 #define product(a, b) ((a) * (b)) int main() { //定义一个变量用于存储结果 int result; result = product(2 + 3, 2 + 3); printf("result = %d", result); return 0; }
3> 条件编译
基本使用
① #if后必须加上#endif ② 条件编译的判断条件不能为普通的变量,要使用宏 ③ #ifdef COUNT表示如果定义了宏COUNT就编译#ifdef COUNT 后的代码
示例
#include <stdio.h> //定义宏A #define A 10 int main() { //如果没有定义宏A,就编译以下代码 #ifndef A printf("没有定义宏变量A\n"); //如果定义了宏A,就编译以下代码 #else printf("定义了宏变量A\n"); #endif return 0; }
4> 文件包含
基本使用
① 系统文件用<>包含,用户自定义文件用()包含 ② 不允许循环包含 ③ #include包含的文件,只是纯文本拷贝文件内容到#include出现的 地方 ④ 用条件编译可以控制某个文件只被包含一次 ⑤ 不同文件中用于条件编译的宏不能同名
示例
//文件名main.h #include <stdio.h> //该文件中包含了求两个整数和的函数 #include "sum.h" int main() { //定义一个变量存储函数sum的返回值 int result; //求两个整数的和 result = sum(10, 12); printf("result=%d\n", result); return 0; } ---------- //文件名sum.c int sum(int a, int b) { return a + b; } ---------- //文件名sum.h #ifndef SUM_H #define SUM_H int sum(int a, int b); #endif
typedef
1> 基本使用用typedef为某个类型定义的别名,可以像这个类型一样定义变量
typedef通常用于为一个复杂的类型定义一个简单且有意义的别名,如:为结构体定义一个别名
2> 使用注意
某种情况下宏定义可以完成typedef的功能,宏定义的别名在前
① 宏定义在定义新类型时,是文本替换 ② typedef在定义新类型时,是语义替换
#define和typedef
1> 相同点都可以为各种数据类型定义别名
2> 不同点
typedef 仅限于为类型定义别名;#define 不仅可以为类型定义别名,也可以为数值定义别名
typedef 是由编译器执行解释的;#define 是由编辑器执行处理的,是预处理指令
static和extern
1> static和extern对函数的作用extern
① 可以声明和定义一个外部函数,可以被本文件和其他文件访问 ② 默认为外部函数,extern可以省略 ③ 在整个项目的所有文件中,不允许出现同名的外部函数
static
① 可以声明和定义一个内部函数,只能被本文件访问 ② static不可以省略 ③ 在整个项目的不同文件中,可以出现同名的内部函数
2> static和extern对变量的作用
全局变量
① 默认为外部变量 ② static用于定义一个内部全局变量,extern用于声明一个外部全局 变量 ③ 不同文件中同名的内部变量不会相互影响 ④ 外部全局变量可以重复定义,且同一时刻只会保留一个值
局部变量
① static定义的局部变量,只会定义一次,代码执行时定义存储空间 ② static延长了局部变量的声明周期,但不会改变作用域 ③ 所有调用用static定义变量的代码块共享该局部变量
相关文章推荐
- C++使用简单的函数指针
- 一起talk C栗子吧(第三十四回:C语言实例--巧用溢出计算最值)
- C/C++ static使用方法注意
- JSON for C++ 介绍1
- C语言-FunctionPointer
- c与c++中struct区别
- C语言-DynamicMemory
- C++标准程序库笔记(2)
- [c语言]冒泡排序-------对折判断法
- [c语言]冒泡排序升级版------选择排序简单版
- C语言-Pointer(high)AndMacro
- C语言 sscanf,sprintf函数 使用总结
- C语言-Pointer
- C语言结构体的字节对齐实例【C语言笔试题】
- C语言-Struct
- C语言第一天
- C语言-Function
- C语言-Array(High)
- C语言-Array
- C语言-Loop