新网创想网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
(1)没有类型限制,宏替换只是单纯代码文本的替换,不会检测类型。
我们提供的服务有:成都网站制作、网站建设、微信公众号开发、网站优化、网站认证、江夏ssl等。为上千企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的江夏网站制作公司
(2)所谓“宏调用”实际上是在编译阶段将代码替换,在编译完成之后,程序执行时,不存在宏调用的步骤,函数调用是在程序执行时实际调用的,两者没有可比性。
它们本质是一样的,都是将 #define 之后的内容用另一段内容替代而已,唯一的区别就是宏常量通常是数字,而宏替换可以变得很复杂。这个就好像一个函数,f(x)=x,这样写的话很简单,但是 x 也可以是很复杂的东西,例如 f(x^3)=x^3,这两个函数都是 f,唯一的区别就是自变量的表示不一样而已。而宏替换也是如此,我们可以给 x 一个很简单的数字,也可以给它一个字符串,也可以给它一个很复杂的表达式,但是最终的效果都是将我们的宏定义替换一下。
应该看C语言教材书上的内容,那里讲的会比较详细.
宏替换就是文本替换,注意以下程序段:
#include stdio.h
#define MAX 5
int main(void)
{
int a[MAX];
int i;
for (i=0;iMAX;i++) scanf("%d",a[i]);
return 0;
}
这个程序定义了一个自定义宏MAX,它的替换文字是5,在程序开始编译之前,驰处理器会完成宏替换的操作,将这个程序文件中的所以MAX都替换成5,然后编译器再执行编译.
定义宏是,一般建议用括号括起来。我们来看两个例子:
例子一:
#define N m + 1
如果代码里面我们写
N * N
想象看会变成什么
m + 1 * m + 1
也就是 1 + 2 * m 这可能不是你需要的。
例子二 : 如果我们用括号括起来
#define N ( m + 1 )
同样的
N * N
这时候会替换 成
( m + 1 ) * ( m + 1 )
这样的结果才是对的。
回过头来看看你的代码, 你 需要 把 宏 括起来
#include iostream.h
#define N (2) // 这里括起来不括起来没区别;但 如果你写成 #define N 1 + 1 就可能造成区别的,所以一般宏定义建议加个括号。
#define M (N+1)
#define NUM (2 * M + 1)
int main() {
for(int i=1; i=NUM; ++i)
cout i;
}