const、static和extern关键字

转载 2016年05月30日 21:21:55

一、宏定义

概念:宏定义实质是一个预编译指令,在程序未运行之前将某些指令付给相应的变量。一般情况预处理指令都是以#号开头的,所以宏定义也是以#开发,关键字为#define(定义宏定义),#undef(结束宏定义)。

定义格式及作用域 
一般宏定义都定义在程序的首段: #define 宏名 值。 
宏定义的作用域:从开始定义的那行起,一直到文件末尾,虽然默认情况下宏定义的作用域是从定义的那一行开始, 一直到文件末尾。但是我们也可以通过对应的关键字#under提前结束宏定义的作用域。

宏定义规范 
一般情况宏名都大写, 多个单词之间用_隔开, 并且每个单词全部大写,并写在程序的头部。 
有的公司又要求宏名以k开头, 多个单词之间用驼峰命名 
注意: 
宏定义后面不要用分号。

iOS开发中宏定义使用场景 
获取屏幕的宽度 
获取手机系统版本号 
做一个单例 
判断系统版本 
·························· 
带参数的宏定义 
带参数的宏定义注意点: 
1.一般情况下建议写带参数的宏的时候, 给每个参数加上一个() 
2.一般情况下建议写带参数的宏的时候, 给结果也加上一个()

二、const关键字 
const对基本数据类型的作用, 可以让基本数据类型的变量变为常量。 
const有两种写法,: 
1.写在数据类型的左边 
2.写在数据类型的右边

const的作用 
(1)可以定义const常量,具有不可变性。 
2)便于进行类型检查,使编译器对处理内容有更多了解,消除了一些隐患。 
(3)可以避免意义模糊的数字出现,同样可以很方便地进行参数的调整和修改。 同宏定义一样,可以做到不变则已,一变都变! 
(4)可以保护被修饰的东西,防止意外的修改,增强程序的健壮性。 
(5) 可以节省空间,避免不必要的内存分配。 
(6) 提高效率。编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。

如何使用const

1.修饰常指针:(面试常考) 
const int *A; //const修饰指针,A可变,A指向的值不能被修改 
int const *A; //const修饰指向的对象,A可变,A指向的对象不可变 
int *const A; //const修饰指针A, A不可变,A指向的对象可变 
const int *const A;//指针A和A指向的对象都不可变

修饰常指针的技巧 
先看“*”的位置 
如果const 在 *的左侧 表示值不能修改,但是指向可以改。 
如果const 在 *的右侧 表示指向不能改,但是值可以改 
如果在“*”的两侧都有const 标识指向和值都不能改。

2.修饰一般常量 
修饰符const可以用在类型说明符前,也可以用在类型说明符后。

3.修饰常数组 
修饰常数组(值不能够再改变了)定义或说明一个常数组可采用如下格式: 
int const a[5]={1, 2, 3, 4, 5}; 
const int a[5]={1, 2, 3, 4, 5}; 
const int a[5]={1, 2, 3, 4, 5}; 
a[1] = 55; // 错误

4.修饰函数的常参数 
修饰函数的常参数const修饰符也可以修饰函数的传递参数,格式如下: void Fun(const int Var); 告诉编译器Var在函数体中的无法改变,从而防止了使用者的一些无 意的或错误的修改。

5.修饰函数的返回值 
修饰函数的返回值: const修饰符也可以修饰函数的返回值,是返回值不可被改变,格式如 下: 
const int Fun1(); 
const MyClass Fun2();

三、static和extern关键字

内部和外部函数 
内部函数:只能在本文件中访问的函数。 
外部函数:可以在本文件中以及其他的文件中访问的函数。 
默认情况下所有的函数都是外部函数。

static关键字 
1.只要在函数的返回值前面加上static就可以让函数变为内部函数, 其它文件就不能访问了。 
2.如果static写在函数的实现中, 代表定义一个内部函数。 
3.如果static写在函数的声明中, 代表声明一个内部函数

【面试】关键字static有三个明显的作用:

1)在函数体内,一个被声明为静态的变量在这一函数被调用过程中维持其值不变(该变量存放在静态变量区)。

2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。

3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。

extern关键字 
1.只要在函数的返回值前面加上一个extern就可以让函数变为一个外部函数, 由于默认就是外部函数, 所以在开发中一般情况extern没人写。

2.如果extern写在函数的实现中, 代表定义一个外部函数。

3.如果extern写在函数的声明中, 代表声明一个外部函数。

四、typedef 关键字 
typedef可以给一个已知的数据类型起别名 (外号),在iOS开发中经常使用,所以必须掌握。

typedef的格式: 
typedef 原有的数据类型 别名(外号);

typedef注意: 
1. typedef不仅能给系统原有的数据类型起别名, 也可以给一个自定义的数据类型起别名。 
2. 利用typedef给数据类型起别名, 并不会生成一个新的数据类型, 仅仅是给原有的类型起了一个别名而已。

给枚举类型起别名 
1.先定义枚举类型, 再给枚举类型起别名 
enum Gender 

kGenderMale, 
kGenderFemale 
}; 
typedef enum Gender SEX;

2.定义枚举类型的同时给枚举类型起别名 
typedef enum Gender 

kGenderMale, 
kGenderFemale 
} SEX;

3.定义枚举类型的同时给枚举类型起别名, 并且省略枚举原有类型名称 
typedef enum 

kGenderMale, 
kGenderFemale 
} SEX;

定义枚举变量有3种方式 
1.先定义枚举类型, 再定义枚举变量 
2.定义枚举类型的同时定义枚举变量 
3.定义枚举类型的同时定义枚举变量, 并且省略枚举类型名称

给结构体类型起别名 
1.先定义结构体类型, 再给类型起别名 
struct Person 

int age; 
double height; 
char *name; 
}; 
// SPerson == struct Person 
typedef struct Person SPerson;

2.定义结构体类型的同时, 给结构体类型起别名 
typedef struct Person 

int age; 
double height; 
char *name; 
} SPerson;

3.定义结构体类型的同时, 给结构体类型起别名, 并且省略掉原有类型的名称 
typedef struct 

int age; 
double height; 
char *name; 
} SPerson;

stm32f103学习笔记——关键字extern、static、const

1、extern extern放在变量和函数声明之前,表示该变量或者函数在别的文件中已经定义,提示编译器在编译时要从别的文件中寻找。除此之外,extern还可以用来进行链接指定。 (1) 声明外部变量...
  • Lang_Billow
  • Lang_Billow
  • 2015年04月06日 21:07
  • 2040

static extern const 静态全局变量与全局变量的区别

static:和extern是用来设置作用域的 const:设置变量只可以被读,不可以被修改static:用static修饰的变量,在其所限定的作用域中只会有一分内存1:在一个函数内部:说明是一个静...
  • li15809284891
  • li15809284891
  • 2017年02月08日 09:54
  • 1510

const,static,extern 的理解

static 修饰局部变量 让局部变量只初始化一次局部变量在程序中只有一份内存并不会改变局部变量的作用域,仅仅是改变了局部变量的生命周期(只到程序结束,这个局部变量才会销毁) 修饰全局变量 ...
  • chen_gp_x
  • chen_gp_x
  • 2016年11月13日 16:27
  • 21542

CONST,STATIC,EXTERN用法总结!

最近看许多公司笔试都考这几方面的内容,于是乎就搜索了一下,把这几个知识点总结以下,以增强基础,以及应付未来的笔试++++++++++++++++++++++++++++++++++++++++++++...
  • adriano119
  • adriano119
  • 2008年09月28日 11:13
  • 5506

Static、const、extern区别

Static、const、extern区别
  • wang1514869032
  • wang1514869032
  • 2016年08月08日 16:43
  • 1158

static const extern在C与C++中的区别

C中const的用法: 1, 在定义变量时使用(由于const常量在定义后不能被修改,所以在定义时一定要进行初始化操作): a)  最简单的用法,说明变量为一个常变量(在以下例子里,int 和co...
  • CC285494320
  • CC285494320
  • 2016年06月02日 18:40
  • 440

简单介绍C语言中auto,register,static,const,volatile,extern等几个关键字的作用

C语言中auto,register,static,const,volatile,extern等几个关键字的作用
  • slience_J
  • slience_J
  • 2016年07月20日 10:36
  • 385

嵌入式中最重要的四个词语static,extern,volatile,const

嵌入式中最重要的四个词语static,extern,volatile,const
  • changhonglin
  • changhonglin
  • 2015年08月18日 21:41
  • 500

ios高效开发-如何正确使用const,static,extern

前言 本篇主要介绍在开发中怎么使用const,static,extern3个关键字,如果喜欢我的文章,可以关注我微博:吖了个峥,也可以来小码哥,了解下我们的iOS培训课程。后续还会更新更多内容。...
  • daleiwang
  • daleiwang
  • 2016年01月25日 15:32
  • 6817

IOS-objectiveC【语法】修饰符 static extern const

objectiveC【语法】修饰符 static extern const const const最好理解,修饰的东西不能被修改 指针类型根据位置的不同可以理解成3种情况: I 常量指针 /...
  • u014351782
  • u014351782
  • 2014年04月01日 14:52
  • 3647
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:const、static和extern关键字
举报原因:
原因补充:

(最多只允许输入30个字)