服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C语言中#define定义的标识符和宏实例代码

C语言中#define定义的标识符和宏实例代码

2022-10-13 13:48诚挚的乔治 C/C++

C语言中,可以用#define定义一个标识符来表示一个常量,下面这篇文章主要给大家介绍了关于C语言中#define定义的标识符和宏的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下

1.#define定义标识符

在C语言程序中,有时候会包含#define

#define可以定义标识符

也就是说可以对字符重新定义,实现代替的作用

语法

#define name stuff

就比如说:

#define MAX 1000(用MAX代替1000)

#define reg register (用reg代替register)

举个栗子

#include<stdio.h>
#define MAX 100
int main()
{
	printf("%d", MAX);
	return 0;
}

当代码运行的时候

在代码编译的预处理阶段 就会把宏替换为文本程序代码

代替的结果如下:

#include<stdio.h>
int main()
{
	printf("%d", 100);
	return 0;
}

注意:#define定义标识符后面尽量不加上分号,因为如果加上的话,在替换的过程中,分号也会别替换到文本程序中,有时候会导致出现逻辑错误。

 

2.#define定义宏

#define规定允许将参数替换到文本中,这样包含参数叫做#define定义宏

宏在程序中,执行的速度更快,因为相对于函数,宏没有函数的调用和返回的开销

语法:
#define SQUARE(x) x*x

这与#define定义宏一样,都是完成替换的,不过#define定义宏后面有一个括号,包含参数

下面用#define定义宏来实现两个数求最大值

#include<stdio.h>
#define MAX(x,y) ((x)>(y)?(x):(y))
int main()
{
	int a = 20;
	int b = 10;
	int c = MAX(a,b);
	printf("%d", c);
	return 0;
}

替换后的结果为:

#include<stdio.h>
int main()
{
	int a = 20;
	int b = 10;
	int c = a>b?a:b;
	printf("%d", c);
	return 0;
}

在#define定义宏的时候,后面的参数尽量带上括号,使每一个参数相对独立

这样可以避免由于操作符的优先级不同,导致最终的逻辑就错了

举个栗子:

#include<stdio.h>
#define sum(x) x*x
int main()
{
	int ret = sum(3 + 3);
	printf("%d", ret);
}

C语言中#define定义的标识符和宏实例代码

如果不仔细观察的话,可能你认为的结果就是36

这个代码的计算过程为:3+3*3+3,并不是(3+3)*(3+3)

 

#define替换的规则

#define定义标识符和宏时,程序会继续如下步骤

1.在定义宏时,先对参数进行检查,如果参数里包含有#define定义的标识符时,首先完成相应的替换

 

2.替换文本会随后插入到原来文本文件中,对于宏来说,参数名被他们的值所替换

 

3.最后进行检查,果然还有#define定义的符号,将重复上述的操作

注意:

1.#define参数中可以包含其他由#define定义的标识符,但是#define不能递归

2.如果#define的参数名存在在字符串中,将不会完成替换

 

#与## #的用法:

在不确定参数的情况下,可以使用 “#n” ,可以实现不同字符串的插入

效果如下:

#include<stdio.h>
#define PRINT(n) printf("the value of "#n" is %d\n",n);
int main()
{
	int a = 10;
	PRINT(a);
	int b = 20;
	PRINT(b);
  int c= 30;
  PRINT(c);
	return 0;
}

替换后的效果为:

#include<stdio.h>
int main()
{
	int a = 10;
  printf("the value of" "a" " is %d\n",a);
	PRINT(a);
	int b = 20;
	PRINT(b);
  printf("the value of " "b" " is %d\n",b);
  int c= 30;
  PRINT(c);
  printf("the value of " "c" " is %d\n",c);
	return 0;
} 

C语言中#define定义的标识符和宏实例代码

##的用法:

#include<stdio.h>
#define CAT(Max,num) Max##nu
int main()
{
	int Maxnum = 100;
	printf("%d", Maxnum);
	return 0;
}

C语言中#define定义的标识符和宏实例代码

双##的用法可以拼接两个字符串

当然这个前提是拼接后的字符串必须产生一个合法的标识符,否则结果就是未定义的

 

宏的缺点

1.如果使用宏过多,宏定义的代码插入到程序中,会大幅度增加程序的长度

2.宏是没法调试的

3.宏与类型无关,导致程序不够严谨

4.宏会带来优先级的问题,容易导致程序的错误

 

宏和函数的优缺点

1).在代码长度角度上,因为宏是直接替换所以若宏较长会增加代码长度

2).在执行速度上,宏较函数快,因为函数存在调用/返回时的额外开销

3).在参数求值方面,define定义的宏可能会具有副作用会导致修改变量最后的值,而函数即使调用多次也不会修改变量原来的值

4).在参数类型方面,宏与类型无关,所以宏是可以传参数的而函数不行在C中函数是不可以传类型的

5).在是否可调试方面,宏不可调试,函数可调试宏可以传类型的检测,实现malloc(动态开辟内存的函数)

#include<stdio.h>
#include<stdlib.h>
#define MALLOC(COUNT,TYPE)\
  (TYPE *)alloc(COUNT*sizeof(TYPE))
void *alloc(int sz)   //宏可以传类型,函数不可以传类型
{
  void *p=malloc(sz);
  if(p == NULL)
  {
      printf("out of memory\n");
      exit(EXIT_FAILURE);
  }
  return p;
}
int main()
{
  int i=0;
  int *p=MALLOC(10,int);
  for(i=0;i<10;i++)
  {
      *(p+i)=i;
  }
  for(i=0;i<10;i++)
  {
      printf("%d ",*(p+i));
  }
  free(p);
  system("pause");
  return 0;
}

总结

到此这篇关于C语言中#define定义的标识符和宏的文章就介绍到这了,更多相关C语言#define定义标识符和宏内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/m0_64332179/article/details/123227653

延伸 · 阅读

精彩推荐
  • C/C++C语言实现简单扫雷小游戏

    C语言实现简单扫雷小游戏

    这篇文章主要为大家详细介绍了C语言实现简单扫雷小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    _Saoke8242021-08-03
  • C/C++利用c语言实现卷积码编码器示例

    利用c语言实现卷积码编码器示例

    这篇文章主要介绍了利用c语言实现卷积码编码器示例,需要的朋友可以参考下...

    C语言程序设计4992021-01-18
  • C/C++关于C++静态成员函数访问非静态成员变量的问题

    关于C++静态成员函数访问非静态成员变量的问题

    静态成员函数不能访问非静态成员,这是因为静态函数属于类而不是属于整个对象,静态函数中的 member可能都没有分配内存。静态成员函数没有隐含的th...

    C++教程网11662021-01-05
  • C/C++C语言实现密码强度检测

    C语言实现密码强度检测

    这篇文章主要为大家详细介绍了C语言实现密码强度检测,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    上清灵宝道人7202021-08-26
  • C/C++C++ opencv实现车道线识别

    C++ opencv实现车道线识别

    这篇文章主要为大家详细介绍了C++ opencv实现车道线识别,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    xiao__run5652021-10-22
  • C/C++深入理解C语言 static、extern与指针函数

    深入理解C语言 static、extern与指针函数

    这篇文章主要介绍了C语言 static、extern与指针函数,有需要的朋友可以参考一下...

    C语言教程网4282021-01-11
  • C/C++一篇文章带你了解C语言内存对齐解决的问题

    一篇文章带你了解C语言内存对齐解决的问题

    内存对齐的目的是为了提高CPU读写内存里数据的速度。现代的CPU读取内存并不是一个一个字节挨着读取,这样做的效率非常低。现代的CPU一般以4个字节(3...

    Wallace Zhang6112021-12-15
  • C/C++C++调用C#的DLL实现方法

    C++调用C#的DLL实现方法

    这篇文章主要介绍了C++调用C#的DLL实现方法,很有实用价值,需要的朋友可以参考下...

    C++教程网11432021-01-23