23.define

const和#define区别总结:

  1. const有类型,可进行编译器类型安全检查。#define无类型,不可进行类型检查.
  2. const有作用域,而#define不重视作用域,默认定义处到文件结尾.如果定义在指定作用域下有效的常量,那么#define就不能用。

无参宏定义

无参宏定义的一般形式为:#define 标识符 字符串
其中的“#”表示这是一条预处理命令。凡是以“#”开头的均为预处理命令。“define”为宏定义命令。“标识符”为所定义的宏名。“字符串”可以是常数、表达式、格式串等。

#define _CRT_SECURE_NO_WARNINGS
#include "iostream"
using namespace std;
#define M (a + b)

int main(){

	int s, a, b;
	printf("inputnumbera&b:");
	cout << "inputnumber  a 和 b" << endl;
	cin >> a >> b;
	s = M*M;
	cout << "s ===" << s << endl;
	system("pause");
	return EXIT_SUCCESS;
}

上例程序中首先进行宏定义,定义M来替代表达式(a+b),在 s= M * M 中作了宏调用。在预处理时经宏展开后该语句变为: S=(a+b)*(a+b) 但要注意的是,在宏定义中表达式(a+b)两边的括号不能少。否则会发生错误。 如当作以下定义后:#define M (a)+(b) 在宏展开时将得到下述语句:S= (a)+(b)*(a)+(b)

带参宏定义

c语言允许宏带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。对带参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参。
带参宏定义的一般形式为:  #define 宏名(形参表) 字符串
在字符串中含有各个形参。 带参宏调用的一般形式为:  宏名(形参表)

ex1:

#define M(y) ((y)*(y)+3*(y))/*宏定义*/
k=M(5);/*宏调用*/

在宏调用时,用实参5去代替形参y,经预处理宏展开后的语句为: k=5*5+3*5

ex2:

#define _CRT_SECURE_NO_WARNINGS
#include "iostream"
using namespace std;
#define MAX(a, b) ((a>b) ? (a) : (b))

int main(){
	int x, y, max;
	cout << "input two numbers:" << endl;
	cin >> x >> y;
	max = MAX(x, y);
	cout << "max====" << max << endl;
	system("pause");
	return EXIT_SUCCESS;
}

上例程序的第一行进行带参宏定义,用宏名MAX表示条件表达式 (a>b)?a:b ,形参a,b均出现在条件表达式中。程序中 max=MAX(x,y) 为宏调用,实参x,y,将代换形参a,b。宏展开后该语句为: max=(x>y)?x:y; 用于计算x,y中的大数。

#define 条件编译

头文件(.h)可以被头文件或C文件包含;重复包含(重复定义)由于头文件包含可以嵌套,那么C文件就有可能包含多次同一个头文件,就可能出现重复定义的问题的。 通过条件编译开关来避免重复包含(重复定义)
例如

#ifndef__headerfileXXX__
#define__headerfileXXX__
//文件内容
#endif

宏常量没有类型,所以调用了int类型重载的函数。const有类型,所以调用希望的short类型函数

#define PARAM 128
const short param = 128;

void func(short a){
	cout << "short!" << endl;
}
void func(int a){
	cout << "int" << endl;
}

#undef A  //卸载宏常量A

#define _CRT_SECURE_NO_WARNINGS
#include "iostream"
using namespace std;

void func1(){
	const int a = 10;
#define A 20 
	//#undef A  //卸载宏常量A
}
void func2(){
	//cout << "a:" << a << endl; //不可访问,超出了const int a作用域
	cout << "A:" << A << endl; //#define作用域从定义到文件结束或者到#undef,可访问
}


int main(){

	//test01();
	func1();
	func2();

	system("pause");
	return EXIT_SUCCESS;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值