C语言-07-预处理、typedef、static和extern
预处理
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语言-07-预处理、typedef、static和extern的更多相关文章
- typedef , static和 extern
typedef 1.作用:给已经存在的类型起一个新的名称 2.使用场合: 1> 基本数据类型 2> 指针 3> 结构体 4> 枚举 5> 指向函数的指针 #include ...
- C语言之预处理命令与用typedef命名已有类型
预处理命令 主要是改进程序设计环境,以提高编程效率,不属于c语言本身的组成部分,不能直接对它们进行编译,必须在对 程序编译之前,先对程序中的这些特殊命令进行“预处理”.比如头文件. 有以下三类:宏定义 ...
- 《OOC》笔记(1)——C语言const、static和extern的用法
<OOC>笔记(1)——C语言const.static和extern的用法 C语言中const关键字用法不少,我只喜欢两种用法.一是用于修饰函数形参,二是用于修饰全局变量和局部变量. 用c ...
- C语言-1.static 和 extern使用,2.文件,3.数据块读写
1.static 和 extern使用, 1)修饰局部变量 static修饰局部变量特点:延长局部变量的生命周期 ,static修饰的局部变量只会被执行一次 extern不能修饰局部变量 2)修饰全局 ...
- C语言-07其它相关
预处理指令 /* 不带参数的宏定义 1.所有的预处理指令都是以#开头 2.预处理指令分3种 1> 宏定义 2> 条件编译 3> 文件包含 3.预处理指令在代码翻译成0和1之前执行 4 ...
- typedef,static,const用法
一.typedef主要功能是定义一个已存在类型的别名,但是和宏并存 宏与typedef区别 1.宏定义只是简单的字符串替换 2.typedef定义的类型是类型的别名,typedef后面是一个整体声明, ...
- 【VS开发】static、extern分析总结
引用请注明出处:http://blog.csdn.net/int64ago/article/details/7396325 对于写了很多小程序的人,可能static和extern都用的很少,因为sta ...
- 15-static和extern关键字1-对函数的作用
一.extern与函数 如果一个程序中有多个源文件(.c),编译成功会生成对应的多个目标文件(.obj),这些目标文件还不能单独运行,因为这些目标文件之间可能会有关联,比如a.obj可能会调用c.ob ...
- static和extern关键字 对函数的作用
本文目录 • 一.extern与函数 • 二.static与函数 • 三.static.extern与函数的总结说明:这个C语言专题,是学习iOS开发的前奏.也为了让有面向对象语言开发经验的程序员,能 ...
随机推荐
- iOS-UITextField-常用方法
一.textField的常用设置 // 创建文本框 UITextField *tf = [[UITextField alloc] initWithFrame:CGRectMake(60, 10 ...
- 求1+2+3+...+n
求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). 卧槽,剑指Offer竟然有这样的题... public ...
- SQL Server里强制参数化的痛苦
几天前,我写了篇SQL Server里简单参数化的痛苦.今天我想继续这个话题,谈下SQL Server里强制参数化(Forced Parameterization). 强制参数化(Forced Par ...
- css知识
margin和padding是什么意思 margin外边距,padding内边距,外边距表示一个元素的边到相邻元素的距离,内边距表示元素之间的内容和元素边框的距离. font:12px/1.5 表示什 ...
- iOS实现图像的反色,怀旧,色彩直方图效果
反色是与原色叠加可以变为白色的颜色,即用白色(RGB:1.0,1.0,1.0)减去原色的颜色.比如说红色(RGB:1.0,0,0)的反色是青色(0,1.0,1.0).在OPENGL ES中为1. 通过 ...
- Github教程(1)
Git基本命令 git diff:查看工作树,暂存区,最新提交之间的差别 举例: 在README.MD中增加一行 ## This is the subtitle 执行git diff 命令,查看当前工 ...
- Linq专题之Linq查询from子句
Linq查询表达式包含8个常用的子句:from.where.select.join.into.orderby.group.let.我们来看看详细的说明. from: 指定查询操作的 ...
- BI之SSAS完整实战教程4 -- 部署至SSAS进行简单分析
上一篇已经创建了多维数据集的结构. 接下来我们将多维数据集的架构定义发送到Analysis Services实例,部署到AS上去. 文章提纲 部署和浏览多维数据集 SSMS使用简介 总结 一.部署和浏 ...
- 【C#进阶系列】04 类型基础
关于System.Object 所有类型都从System.Object派生而来. System.Object的公共方法中ToString()一般是返回对象的类型的全名,只有Int32这些类型将其重写后 ...
- PowerDesigner工具箱(palette)如何打开
我使用的PowerDesigner是15.1版本的,其他版本的操作可能会有所不同 我们在使用PowerDesigner的时候,有时候可能会不小心把悬浮的工具箱隐藏掉,就是下面这个东西 怎么显示出来呢, ...