宏和函数的区别

原创 2018年04月15日 15:48:53

  • 通常被应用于执行简单的算法,比如找出两个数中的最大值:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#define Max(x,y) x>y?x:y
int main()
{
	int a = 0;
	int b = 0;
	int c = 0;
	printf("Enter a:");
	scanf("%d", &a);
	printf("Enter b:");
	scanf("%d", &b);
	c=Max(a, b);
	printf("%d\n", c);
	system("pause");
	return 0;
}

代码运行如下:


这个代码不可以用函数完成?

当然可以用函数,只是宏比函数在这个代码中更加有优势:

1:代码非常简单,使用宏直接在编译期间就替换了c,而函数要调用以及返回,这些时间可能比代码执行的时间还要多;

2:宏可以用于整形,长整型,浮点型等可以用>来比较的类型,与类型无关;但是函数的参数必须声明为特定的类型;

  • 还可以干一些函数做不到的事情,比如宏可以出现类型,但是函数不可以。
#define MALLOC(num,type) (type*)malloc(num*sizeof(int))

malloc(10,int)即向内存申请10个类型为int型的内存;

当然宏也有劣势:

  1. 使用宏时,除非代码很短,否则会造成篇幅大度增长,比如宏有20行,被调用20次,就会使代码增加400行;
  2. 宏没有办法调试,比如由于宏少带括弧造成的运算错误,调试时没有办法确定错误的位置;
  3. 宏与类型无关,当然也就不够严谨;
  4. 宏会因为括号的问题导致程序出错;

带有副作用的宏:(包含i++,i--等)

#include<stdio.h>
#include<stdlib.h>
#define MAX(a,b) ((a)>(b)?(a):(b))
int main()
{
	int x = 5;
	int y = 8;
	int z = MAX(x++, y++);//后置++,先使用后加1;
	printf("x=%d y=%d z=%d ", x, y, z);
	system("pause");
	return 0;
}

这段代码我们期望输出x=6,y=9,z=8;

运行结果:


正是因为宏的副作用导致出错,预处理后:z=((x++)>(y++)?(x++):(y++))

后置++,先使用后++,5>8不成立x=6,y=9,输出z=9,y++变成10;

所有在使用宏时可能存在危险,导致不可估量的错误;

  • 一个简单的例题:使用宏将一个数的奇数位和偶数位互换
#include<stdio.h>
#include<stdlib.h>
#define exchange(a)  ((a&(0x55555555))<<1)|((a&(0xAAAAAAAA))>>1)
int main()
{
	int a = 5;               
	int b = exchange(a); //取出奇数位右移一位,偶数位左移一位
	printf("%d\n", b);
	system("pause");
	return 0;
}

代码思路:

取出奇数位:a&10101010101010101010101010101010

取出偶数位:a&01010101010101010101010101010101

奇数位右移一位到偶数位,偶数位左移一位到奇数位;

由于二进制数太多,会导致常量太大,所以可以将二进制改成十六进制;

运行如下:



Number类

本课程介绍java.lang.Number类 详细介绍了Number类的使用,格式化,精确计算等
  • 2017年02月06日 13:33

C语言宏定义和宏定义函数

要写好C语言,漂亮的宏定义是非常重要的。宏定义可以帮助我们防止出错,提高代码的可移植性和可读性等。   在软件开发过程中,经常有一些常用或者通用的功能或者代码段,这些功能既可以写成函数,也可以封装成...
  • bytxl
  • bytxl
  • 2015-05-26 14:51:03
  • 11034

宏和函数的区别

属性 #define宏 函数 代码长度 每次使用,宏代码都被插入到程序中。除了非常小的宏之外,程序的长度将大幅度增长 函数代码只出现于同一个地方;每次使用这个函数时,都调用那...
  • z517602658
  • z517602658
  • 2016-11-04 20:28:43
  • 566

[C++] Modern C++ Design(MCD)学习笔记 && 测试代码

converse 好装B,求甚解. 荣誉版主 帖子13986主题481精华15可用积分17419 专家积分160 在线时间2483 小时注册时间2003-12-07最后登录2...
  • ilvu999
  • ilvu999
  • 2012-10-18 12:50:06
  • 495

Xcode配置PCH文件

在XCode6以前,创建的项目默认有pch文件。把常用的宏和类的头文件等导入到pch文件使用起来非常的方便,能够提高开发效率。但由于pch的滥用(很多不用的宏,以及大量的头文件)导致了编译效率变低,X...
  • polarGW
  • polarGW
  • 2017-07-06 14:37:53
  • 94

C++编写DLL的方法

在写C++程序时,时常需要将一个class写成DLL,供客户端程序调用。这样的DLL可以导出整个class,也可以导出这个class的某个方法。 一、导出整个class 方法很简单,只需要...
  • ccfxue
  • ccfxue
  • 2016-04-20 13:22:53
  • 201

非议MFC(一)宏和类型定义的困惑

                          非议MFC(一)宏和类型定义的困惑关键字:C++,MFC,宏,macro,define,typedef有感于MFC库代码之去简就繁、之故弄玄虚,作下...
  • cphj
  • cphj
  • 2003-02-01 15:30:00
  • 1242

OS_CPU.H

OS_CPU.H包括了用#defines定义的与处理器相关的常量,宏和类型定义。OS_CPU.H的大体结构如程序清单 L8.1所示。 程序清单 L 8.1 OS_CPU.H. #ifdef OS_C...
  • FunkyFrog821951259
  • FunkyFrog821951259
  • 2017-04-28 15:43:12
  • 149

非议MFC

非议MFC(一)宏和类型定义的困惑                          非议MFC(一)宏和类型定义的困惑关键字:C++,MFC,宏,macro,define,typedef有感于MFC...
  • huntjap
  • huntjap
  • 2005-01-05 11:31:00
  • 1275

c++11新特性总结和boost库的使用

代码见:https://github.com/Jeromecen/cpp11study/tree/master I、保持语言的稳定性和兼容性” 总结:主要是utf8字符串,虚函数override/f...
  • Blues1021
  • Blues1021
  • 2017-06-12 07:01:24
  • 935
收藏助手
不良信息举报
您举报文章:宏和函数的区别
举报原因:
原因补充:

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