iOS开发分分钟搞定C语言 —— 宏定义和关键字

一、宏定义

概念:宏定义实质是一个预编译指令,在程序未运行之前将某些指令付给相应的变量。一般情况预处理指令都是以#号开头的,所以宏定义也是以#开发,关键字为#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;

版权声明:本文为博主原创文章,为了能相互促进,相互学习,请关注新浪微博:极客James

时间: 2024-12-20 15:44:56

iOS开发分分钟搞定C语言 —— 宏定义和关键字的相关文章

彻底搞定C语言指针详解

1.语言中变量的实质 要理解C指针,我认为一定要理解C中“变量”的存储实质, 所以我就从“变量”这个东西开始讲起吧! 先来理解理解内存空间吧!请看下图: 内存地址→ 6 7 8 9 10 11 12 13 ----------------------------------------------------------------- ... | | | | | | | |.. ------------------------------- ---------------------------

转载--c语言宏定义(2)

作者:独舞风 链接:c语言宏定义(2) 1.如何区分宏定义中的“宏名称”和“宏字符串”?对于带参数的宏又该注意什么? 在宏定义中,“宏名称”和“宏字符串”是通过“空格”来区分的,在宏的扩展中,空格会对扩展的结果造成很大的影响.编译器在处理时宏定义时,首先从“#define”后第一个空格开始读取字符串,直到遇见下一个空格为止,两个空格之间的字符串为“宏名称”,确定好“宏名称”之后,本行的所有其他字符串都为“宏字符串”.图示:#define + N个空格(1 < N) + 宏名称(中间没有空格) +

常用的C语言宏定义

常用的C语言宏定义 1,防止一个头文件被重复包含      #ifndef COMDEF_H      #define COMDEF_H          //头文件内容      #endif       2,重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植.       typedef   unsigned char       boolean;      /* Boolean value type. */             typedef   uns

转载--c语言宏定义(1)

作者:独舞风 链接:c语言宏定义(1) 1.为什么要有宏定义? 代码中某个特定数值需要参与运算,而且该数值作用于多个地方,当需要对该数值进行修改时,希望只改动一个地方就能实现该数值的全部更新:即便某个数值只用到一次,当修改时也会面临搜索阅读大量代码.数值含义不明晰的问题:某些“操作块”封装成函数时,调用函数开销(保存上下文环境.参数调用.堆栈分配等)太大影响效率,不封装则需要多次输入相同的“操作块”内容,并且修改麻烦容易出现不一致的问题,这时就需要把“操作块”定义成宏,该方案本质是“空间换时间”

C 语言宏定义

C 语言宏定义1.例子如下: #define PRINT_STR(s) printf("%s",s.c_str()) string str = "abcd"; PRINT_STR(str); 结果如下:abcd2.现在我期望打印出,str=abcd, 容易想到的解决办法是: #define PRINT_STR(s) printf("s" "=" "%s",s.c_str()) 打印出来的结果是 s=abcd

将C语言宏定义数值转换成字符串!

将C语言宏定义转换成字符串! 摘自:https://blog.csdn.net/happen23/article/details/50602667 2016年01月28日 19:15:47 六个九十度 阅读数:10185 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/happen23/article/details/50602667 适用场景举例 流媒体处理系统中,采样率是个很重要的参数,很多地方都要用,如果用来分配内存,则 #define S

iOS开发预备课程之C语言基础(经典必学)

通过本课程的学习,你将掌握如下技能: 一.C语言的基本语法(数据类型,语句,各种运算符).程序设计结构(顺序结构,分支结构,循环结构).复杂数据类型(数组,字符数组,多维数组,结构体).函数等. 二.提升问题分析能力.增强编码能力. 三.为C语言高级内容提供基础支持,为iOS开发提供语法支持. 适合人群 1.计算机相关专业毕业生或者应届生 2.编程爱好者 3.数学专业或者逻辑思维较强的人 学习条件 1.接触过编程语言 或者 对编程有很大兴趣 2.身边有本C语言教材或者电子版书籍 更多IOS学习:

彻底搞定C语言指针,初学者必备

1.语言中变量的实质 要理解C指针,我认为一定要理解C中“变量”的存储实质, 所以我就从“变量”这个东西开始讲起吧! 先来理解理解内存空间吧!请看下图: 内存地址→ 6 7 8 9 10 11 12 13 ----------------------------------------------------------------- ... | | | | | | | |.. ------------------------------- ---------------------------

iOS开发中那些高效常用的宏

#ifndef MacroDefinition_h #define MacroDefinition_h //-------------------获取设备大小------------------------- //NavBar高度 #define NavigationBar_HEIGHT 44 //获取屏幕 宽度.高度 #define SCREEN_WIDTH ([UIScreen mainScreen].bounds.size.width) #define SCREEN_HEIGHT ([UI