c语言预编译,c++ 预编译
其次,#define定义了标识符
语法:#define name stuff(用stuff替换名称)
#定义最大100
#定义字符串“呵呵”
int main()
int max=MAX
printf(%d\n ,max);//输出100
printf(%s\n ,STR);//输出呵呵
返回0;
}
三。#定义定义宏
#define mechanism包括一个允许将参数替换为文本的机制。这种实现通常被称为宏或宏定义。
如何声明宏:# define name(paragraph-list)stuff,其中paragraph-list是用逗号分隔的符号列表,它们可能出现在stuff中。
注意:参数列表的左括号必须紧挨着名称。如果两者之间有任何差距,参数列表将被解释为东西的一部分。
#定义正方形(X) X*X
int main()
int ret=SQUARE(5);
printf(%d\n ,ret);//输出25
返回0;
}
上面的宏定义代码存在一定的问题:如果我们改变一个参数(把5改成5 1),输出不是36而是11。为什么?
#定义正方形(X) X*X
int main()
int ret=SQUARE(5 ^ 1);//替换后为(5 ^ 1 * 5 ^ 1=11)
printf(%d\n ,ret);//输出11
返回0;
}
没有括号
因此,所有用于计算数值表达式的宏定义都应该用这种方式括起来,以避免使用宏时参数中的运算符或相邻运算符之间出现意外的交互。
正确代码:
#定义正方形(X) (X)*(X))
int main()
int ret=SQUARE(5 ^ 1);
printf(%d\n ,ret);//输出36
返回0;
}
四。#定义替换规则:
首先,#定义名字“丽莎”
程序中有名称,但“”中的内容不会被宏替换。
第二,宏定义前面的必须是合法的用户标识符。
第三,宏定义不是说下面的东西可以随便写,字符串的两个“”不能拆开。
四:#定义名字“丽莎”
程序里有上面的宏定义,程序里有一句话:
这样,它就不会被lisa LIST所取代。
第五,宏不能递归。
五、#和# #两个符号(罕见)
函数的作用是:在字符串中插入一个参数。
如果我们想实现一个代码:将一个参数插入到一个字符串中并使用“#”
这里,参数A和B被插入到字符串中。
# #的作用:它两边的符号可以组合成一个符号,允许宏定义从分离的文本片段创建标识符。
图中的三个代码是等价的。
printf( %d\n,年龄(丽莎,24岁));
printf( %d\n,年龄(丽莎# # 24));
printf( %d\n,AGE(Lisa 24));
不及物动词宏和函数的比较
函数和宏可以实现两个数的最大化。
//函数
int Max(int x,int y)
return (x y?x:y);
#定义MAX(X,Y) ((X) (Y)?(X):(Y))
int main()
int a=10
int b=20
int max=Max(a,b);//输出20
printf(%d\n ,max);
max=MAX(a,b);
printf(%d\n ,max);//输出20
返回0;
}
通过分析上面的代码,使用宏比使用函数更好,原因有二:
用于调用函数和从函数返回的代码可能比实际的小计算工作花费更多的时间,所以宏在程序的规模和速度上要优于函数。
函数的参数必须声明为特定类型。因此,函数只能用在适当类型的表达式中。相反,宏是独立于类型的。
当然,与函数相比,宏也有缺点:
每次使用宏时,由宏定义的代码将被插入到程序中。除非宏很短,否则可能会大大增加程序的长度。
无法调试宏。
因为宏类型是独立的,所以不够严谨。
宏可能会引起操作符优先级的问题,从而导致程序出错。
每次使用都会在程序中插入宏代码,除了很小的宏,程序长度会大大增加。
函数的代码只出现在一个地方,每次使用这个函数时,都调用那个地方的相同代码。
操作员优先级
宏是在所有周围表达式的上下文中计算的。除非添加括号,否则相邻运算符的优先级可能会产生意外的结果。因此,建议宏在编写时使用括号。
当调用函数时,参数只计算一次,其结果值传递给函数。表达式的评估结果更容易预测。
有副作用的参数
参数可能会被宏中的多个位置替换,因此对有副作用的参数的求值可能会产生意外的结果。
该函数在传递参数时只计算一次,结果更容易控制。
宏的参数与类型无关。它可以应用于任何参数类型,只要对参数的操作是合法的。
函数的参数与类型有关。如果参数的类型不同,即使它们执行不同的任务,也需要不同的函数。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。