您的位置:首页 > 编程语言 > C语言/C++

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定义变量的代码块共享该局部变量
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: