2021-05-15 对C语言关键字宏定义的理解

Posted Suk_god

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021-05-15 对C语言关键字宏定义的理解相关的知识,希望对你有一定的参考价值。

对C语言关键字、宏定义的理解

C语言关键字

C常见关键字

auto , break , case, char , const , continue , default , do , double , else , enum , extren , float , for , goto , if , int , long , register , return , short , signed , sizeof , static , struct , switch , typedef , union , unsigned , void , volatitle , while

关键字typedef

typedef顾名思义是类型定义,这里应该理解为类型重命名
例如:

//将unsigned int 重命名为uint_32,所以uint_32也是一个类型名
typedef unsigned int uint_32;
int main()
{
	//观察num1和num2,这两个变量类型是一样的
	unsigned   int   num1   =   0;
	uint_32   num2  =  0;
	rreturn 0;
}

使用 typedef 的注意事项:
1、typedef 不可滥用、乱用
比如:

typedef  int  i;
int main()
{
	//这样的“简化”很鸡肋,会让代码可读性大幅度降低。
	int i = 0;
	i   j = 0;
	return 0;
	
}

2、typedef 常用来定义结构体
比如:

typedef struct Student
{
	chat name[20];
	int age;
	char sex[5];
	double weight;
}stu;
int main()
{
	//以下两种方式定义结构体效果相同,但第二种明显方便
	struct Student tom;
	stu jack;
	return 0;
}

关键字static

在C语言中:
static 是用来修饰变量和函数的
修饰局部变量–静态局部变量
修饰全局变量–静态全局变量
修饰函数–静态函数

修饰局部变量

//代码1
#include <stdio.h>
void test()
{
	int i =0;
	i++;
	printf("%d ",i);
}
int main()
{
	int i=0;
	for(i=0;i<10;i++)
	{
		test();
	}
	//结果是:1 1 1 1 1 1 1 1 1 1
	return 0;
}
//代码2
#include <stdio.h>
void test()
{
	//static 修饰局部变量
	static int i =0;
	i++;
	printf("%d ",i);
}
int main()
{
	int i=0;
	for(i=0;i<10;i++)
	{
		test();
	}
	//结果是:1 2 3 4 5 6 7 8 9 10
	return 0;
}

结论:
static修饰局部变量,将该变量的生命周期改为全局,但作用域不变

修饰全局变量

//代码1
//add.c文件内定义全局变量
int g_val = 2021;
//test.c文件内引用add.c文件内的全局变量
//声明
extern int g_val;
int main()
{
	printf("%d\\n",g_val);//2021
	return 0;
}
//代码2
//add.c文件内定义全局变量
static int g_val = 2021;
//test.c文件内引用add.c文件内被static修饰全局变量
//声明
extern int g_val;
int main()
{
	printf("%d\\n",g_val);//报错
	return 0;
}

结论:
1、全局变量:在整个程序内有效
2、static修饰全局变量之后,代表该变量只在定义文件内有效,只能在本文件内被使用,不能在其他文件内被使用。

修饰函数

//代码1
//add.c文件内定义函数
int add(int x,int y)
{
	return x+y;
}
//test.c文件内引用add.c文件内的函数
int main()
{
	printf("%d",add(2,3));//5
	return 0;
}
//代码2
//add.c文件内定义函数
static int add(int x,int y)
{
	return x+y;
}
//test.c文件内引用add.c文件内被static修饰的函数
int main()
{
	printf("%d",add(2,3));
	//编译时出现连接性错误
	return 0;
}

结论:
一个函数被static修饰,说明这个函数只在本文件内有效,不能在其他源文件内使用

注:剩余关键字今后学习到会再补充

define 定义常量和宏

主要特点:
便于后期代码维护

//define 定义标识符常量
#define MAX 1000

简要说明:
宏定义的常量名通常采用全大写的命名方式,并且做到见名知义的效果

//define 定义宏
#define ADD1(X,Y) ((X)+(Y))
#define ADD2(X,Y) X+Y

简要说明:
宏替换:ADD1(x,y) ((x)+(y))
1、命名方式及要求与常量一致
2、x,y是两个占位符号,在引用宏时用户输入的对应数据替换x,y
比如;
ADD1(2,3):2->x,3->y,((2)+(3))->((x)+(y))
3、int num = 10ADD2(2,3):
对于这个表达式来说我们预期得到的结果是50;但实际结果是23
替换过程如下:
num = 10
2+3
注意:在定义宏的时候,对于每一个元素都应该带上圆括号来保证我们程序的正确性!规范写法:ADD(x,y) ((x)+(y))
不要吝啬圆括号的使用~~~

小试牛刀

//define 定义标识符常量
#define MAX 1000
//define 定义宏
#define ADD(X,Y) ((X)+(Y))

#include<stdio.h>
int main()
{
	int sum = ADD(2,3);
	printf("%d\\n",sum);//5
	sum = 10*ADD(2,3);//50
	printf("%d\\n",sum);
	return 0;
}

以上是关于2021-05-15 对C语言关键字宏定义的理解的主要内容,如果未能解决你的问题,请参考以下文章

c语言中的“宏”是指啥?

c语言中的“宏”是指啥?

关于C语言宏定义输出

关于C语言宏定义,这样为啥不行

C语言的宏定义问题

C语言的宏定义问题