【学习笔记】【C语言】宏定义

1.宏定义可以分为2种:
不带参数的宏定义
带参数的宏定义

2.定义

一般形式
#define 宏名 字符串
比如  #define ABC 10
右边的字符串也可以省略,比如#define ABC

3.作用

它的作用是在编译预处理时,将源程序中所有"宏名"替换成右边的"字符串",常用来定义常量。
接下来写个程序根据圆的半径计算周长

4.例子

在第4行定义了一个叫PI的宏,在编译预处理之后,第8行中的2 * PI *radius就会变成2 * 3.14 * radius。

 1 #include <stdio.h>
 2
 3   // 源程序中所有的宏名PI在编译预处理的时候都会被3.14所代替
 4   #define PI 3.14
 5
 6  // 根据圆的半径计radius算周长
 7  float girth(float radius) {
 8     return 2 * PI *radius;
 9 }
10
11 int main ()
12  {
13 float g = girth(2);
14
15 printf("周长为:%f", g);
16 return 0;
17 }

5.注意

1> 宏名一般用大写字母,以便与变量名区别开来,但用小写也没有语法错误

2> 对程序中用双引号扩起来的字符串内的字符,不进行宏的替换操作。比如:

1 #define R 10
2  int main ()
3  {
4      char *s = "Radio";
5      return 0;
6  }

在第1行定义了一个叫R的宏,但是第4行中"Radio"里面的‘R‘并不会被替换成10

3> 在编译预处理用字符串替换宏名时,不作语法检查,只是简单的字符串替换。只有在编译的时候才对已经展开宏名的源程序进行语法检查

1 #define I 100
2  int main ()
3  {
4      int i[3] = I;
5      return 0;
6  }

4> 宏名的有效范围是从定义位置到文件结束。如果需要终止宏定义的作用域,可以用#undef命令
#define PI 3.14
/*
 .
 .
 .
 .
 */
#undef PI
PI这个宏在第1行到第8行之间是有效的,第8行后就无效了

5> 定义一个宏时可以引用已经定义的宏名
#define R  3.0
#define PI 3.14
#define L  2*PI*R
#define S  PI*R*R

6.代码

 1 /*
 2  1.所有的预处理指令都是以#开头
 3  2.预处理指令分3种
 4  1> 宏定义
 5  2> 条件编译
 6  3> 文件包含
 7  3.预处理指令在代码翻译成0和1之前执行
 8  4.预处理的位置是随便写的
 9  5.预处理指令的作用域:从编写指令的那一行开始,一直到文件结尾,可以用#undef取消宏定义的作用
10  6.宏名一般用大写或者以k开头,变量名一般用小写
11  */
12 #include <stdio.h>
13
14
15 //#define kCount 4
16
17 int main()
18 {
19     char *name = "COUNT";
20
21     printf("%s\n", name);
22
23     #define COUNT 4
24
25     int ages[COUNT] = {1, 2, 67, 89};
26
27
28
29     for ( int i = 0; i<COUNT; i++) {
30         printf("%d\n", ages[i]);
31     }
32
33     // 从这行开始,COUNT这个宏就失效
34 #undef COUNT
35
36     int a = COUNT;
37
38     return 0;
39 }
40
41 void test()
42 {
43
44 }
 1 /*
 2  1.带参数的宏定义效率比函数高
 3
 4  */
 5
 6 /*
 7 int sum(int a, int b)
 8 {
 9     return a + b;
10 }*/
11 #include <stdio.h>
12
13 #define sum(v1, v2) ((v1)+(v2))
14
15 #define pingfang(a) ((a)*(a))
16
17 int main()
18 {
19     // pingfang(5+5) (10*10)
20     // pingfang(5+5)
21     // pingfang(5+5) (35)
22     // pingfang(5+5)/pingfang(2)
23     int c = pingfang(5+5)/pingfang(2);
24
25     printf("c is %d\n", c);
26     /*
27     int c = sum(2, 3) * sum(6, 4);
28
29     printf("c is %d\n", c);*/
30     /*
31     int a = 10;
32
33     int b = 20;
34
35
36     int c = sum(a, b);
37
38     printf("c is %d\n", c);
39     //int c = sum(a, b);*/
40
41     return 0;
42 }
时间: 2025-01-06 20:57:02

【学习笔记】【C语言】宏定义的相关文章

iOS学习笔记---c语言第九天

高级指针 指向结构体变量的指针,称为结构体指针 可以使用->指向内容. %p打印地址 void pLenth(cPoint *p1,cPoint *p2) //求两点间的距离  用的开方函数sqrt()和平方函数pow(,) { float a = sqrt(pow((p1->x-p2->x), 2)+pow((p1->y-p2->y), 2)); printf("两点距离为%.2f\n",a); } //main.m中代码 #import <Fou

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

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

iOS学习笔记---oc语言第三天

继承.初始化方法 一.继承 继承的上层:父类  继承的下层:子类 继承是单向的,不能相互继承 继承具有传递性:A继承于B,B继承于C,A具有B和C的特征和行为 子类能继承父类全部的特征和行为(私有变量也继承过来了,只是不能访问) 面向对象提供了继承语法.能大大简化代码,把公共的方法和实例对象写在父类里.子类只需要写自己独有的实例变量和方法即可 继承既能保证类的完整,又能简化代码 继承特点 oc中只允许单继承 没有父类的类称为根类,oc中得根类是NSObject(祖宗) 继承的内容:所有的实例变量

IOS学习笔记---C语言第四天

1 //?生成2个数组,每个数组都有10个元素,元素取值范围20-40之间,数组对应元素相 加,放到另外?一个数组中 2 #import <Foundation/Foundation.h> 3 4 int main(int argc, const char * argv[]) 5 { 6 7 int num1[10]={0},num2[10]={0},num3[10]={0}; 8 for (int i = 0; i<10; i++) { 9 num1[i]=arc4random()%2

iOS学习笔记---oc语言第六天

Block .数组高级 block本质上就是匿名函数(没有名称的函数) block语法和函数指针很相似 回顾函数 函数:C语?中,实现某一类功能的代码段. 完整的函数包含两部分:函数声明.函数定义 函数声明,即函数原型.例如:int sum(int x,int y);具有两个整型参 数,一个整型返回值的函数. 函数定义,即函数实现.例如:int sum(int x,int y){     retrun x + y;     } 回顾函数指针 函数指针(变量):存放函数地址(函数名)的指针变量.

iOS学习笔记---c语言第八天

指针 首先将变量a的地址存放在另一个变量中,比如存放在变量b中,然后通过变量b来间接引用变量a,间接读写变量a的值.用来存放变量地址的变量,就称为"指针变量" int *p=null;   初始值:null恒等于0          变量类型:整型指针 int * 指针变量所占字节数只于操作系统有关 指针类型转换符%p printf("p = %p\n",p); //c语言定义指针的时候,喜欢使用p,q,r等. int *p = NULL; //我们通常所说的指针,

iOS学习笔记---c语言学习第七天

结构体 结构体是一种自定义的数据类型 struct 结构体名 { 类型说明符  成员名: … 类型说明符  成员名: }: #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { struct teacher{ char name[30]; char sex; int age; char course[30]; }; typedef struct teacher Teacher; Teacher c

iOS学习笔记---c语言第十天

动态内存分配 一.存储区划分 从低到高(内存地址小----内存地址大)  :  代码区---常量区---静态区---堆区---栈区 栈内存 //凡是在函数体内定义的变量 都存储在栈区(包括形参). int a = 10;//a也是在栈区域里面 float b = 1.5;//b也是在栈区域里面 char c = 'b'; double d = 3.14; printf("%p %p %p %p\n",&a,&b,&c,&d); //栈的特点先进后出,先定

iOS学习笔记---c语言第六天

函数  function 命名规范:工程名第一个字母大写,变量函数名小写,不要用拼音和中文, eg:lessonFunction 一.函数声明定义 函数是具有特定功能的代码块        作用:模块化程序 用函数的好处:简化程序.提高开发效率.方便阅读和修改等 函数定义: 返回值类型  函数名(形式参数) { 语句 return 返回值: }     返回值类型:viod  int  char float.....    void下面可以不写return    ,int  下面返回值为整型,c

iOS学习笔记---c语言第十一天

函数指针 一.函数指针定义 //函数声明:声明我是一个什么函数 //求两个数的和 //函数的类型:int (int x,int y) //即:我是一个返回值为整型,有两个整型参数的函数. //函数名是 sum int sum(int x,int y); 函数指针定义p是变量,其他是类型(通常没有形参a,b) //函数指针类型 int (*)(int x,int y) //描述:指向 返回值为 int 两个int参数 的 指针类型 //函数指针变量: p //初始值 : sum printf("%