c语言中宏替换函数 c语言中宏替换怎么算
C语言中宏替换占不占用运行时间
1.
创新互联专注于企业成都营销网站建设、网站重做改版、易县网站定制设计、自适应品牌网站建设、HTML5、商城网站建设、集团公司官网建设、成都外贸网站制作、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为易县等各大城市提供网站开发制作服务。
宏替换不占用运行时间。宏替换是在编译时,编译器完成的。占用编译时间。
2.
编译时,编译器会将代码中的宏用对应定义好的代码进行直接替换,然后再对源代码进行编译。
3.
所以宏比函数在运行时更快,因为它不用像函数调用时,要对现有数据进行入栈保存,运行完后,在出栈恢复;它是直接编译好的代码。
C语言 define 带参数的宏替换
楼主 来看看 gcc 预处理命令得到的结果吧 结果是 把整型3 强制转换为 void 类型的 一个表达式
把3 去掉编译就报错了
求c语言中宏常量和宏替换的异同点
它们本质是一样的,都是将 #define 之后的内容用另一段内容替代而已,唯一的区别就是宏常量通常是数字,而宏替换可以变得很复杂。这个就好像一个函数,f(x)=x,这样写的话很简单,但是 x 也可以是很复杂的东西,例如 f(x^3)=x^3,这两个函数都是 f,唯一的区别就是自变量的表示不一样而已。而宏替换也是如此,我们可以给 x 一个很简单的数字,也可以给它一个字符串,也可以给它一个很复杂的表达式,但是最终的效果都是将我们的宏定义替换一下。
C语言:(1)宏替换有数据类型的限制吗?(2)宏调用笔函数调用耗费时间吗?
(1)没有类型限制,宏替换只是单纯代码文本的替换,不会检测类型。
(2)所谓“宏调用”实际上是在编译阶段将代码替换,在编译完成之后,程序执行时,不存在宏调用的步骤,函数调用是在程序执行时实际调用的,两者没有可比性。
C语言宏替换
应该看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,然后编译器再执行编译.
C语言中,宏替换的替换规则
简单来说:宏定义又称为宏代换、宏替换,简称“宏”。宏替换是C/C++的预处理中的一部分,在C++标准中有4条规则来定义替换。
规则1:实参替换。
本条规则描述带参数的宏的替换过程。
对于宏定义中的形参,在替换列表中,如果不是作为#或##的操作数,那么将对应实参完全
展开(相当于对实参进行求值),然后将替换列表中的形参替换掉.如果是#或##的操作数,
那么不进行替换。
规则2:多次扫描。
在所有的形参替换为实参后,对结果进行再次扫描,如果发现还有可替换的宏,则进行替换,
否则中止。
规则3:递归替换抑制。
如果在替换列表中发现当前正在展开的宏的名字,那么这里不进行替换.更进一步,在嵌套
的替换过程中发现已经替换过的宏的名字,则不进行替换。
规则4:递归预处理抑制。
如果替换后的结果形成预处理指令,则不执行这条预处理指令。
看几个C++标准中的例子:
#define x 3
#define f(a) f(x * (a))
#undef x
#define x 2
#define g f
#define z z[0]
#define h g(~
#define m(a) a(w)
#define w 0,1
#define t(a) a
f(y+1) + f(f(z)) % t(t(g)(0) + t)(1);
g(x+(3,4)-w) | h 5) m(f)^m(m);
其结果分别是
f(2 * (y+1)) + f(2 * (f(2 * (z[0])))) % f(2 * (0)) + t(1);
f(2 * (2+(3,4)-0,1)) | f(2 * ( ~ 5)) f(2 * (0,1))^m(0,1);
对于第一个,主要在于t(t(g)(0) + t)(1)的展开。
容易计算出最外层的t的实参是f(2 * (0)) + t,而作为t的参数传入时其中的t是
正在被展开的宏,所以根据规则3,不对这个t进行处理,保持不变,得到f(2 * (0)) + t(1)。
对于第二个,h 5)被替换为g(~5),应用规则2,被替换为f(2 * ( ~ 5))。
而m(m)首先被替换为m(w),然后应用规则2再次进行替换,但是m已经是替换过的了,所以保持
不变,只对w进行替换。
#define str(s) # s
#define xstr(s) str(s)
#define debug(s, t) printf("x" # s "= %d, x" # t "= %s", \
x ## s, x ## t)
#define INCFILE(n) vers ## n /* from previous #include example */
#define glue(a, b) a ## b
#define xglue(a, b) glue(a, b)
#define HIGHLOW "hello"
#define LOW LOW ", world"
debug(1, 2);
fputs(str(strncmp("abc\0d", "abc", ’\4’) /* this goes away */
== 0) str(: @\n), s);
#include xstr(INCFILE(2).h)
glue(HIGH, LOW);
xglue(HIGH, LOW)
其结果分别是
printf("x" "1" "= %d, x" "2" "= %s", x1, x2);
fputs("strncmp(\"abc\\0d\", \"abc\", ’\\4’) = = 0" ": @\n", s);
#include "vers2.h"
"hello";
"hello" ", world"
关键是glue和xglue.
对于glue(HIGH, LOW),首先有一个规则1的抑制,得到HIGHLOW;的结果,然后二次扫描,得到
"hello";
对于xglue(HIGH, LOW)没有抑制效果,所以对参数求值,分别得到HIGH和LOW ", world",即
glue(HIGH, LOW ", world")。
然后进行连接操作得到HIGHLOW ", world",最后再扫描一次得到"hello" ", world"
如果考虑字符串的自然的连接,就可以得到"hello, world"了。
扩展资料
宏语言是一类编程语言,其全部或多数计算是由扩展宏完成的。宏语言并未在通用编程中广泛使用,但在文本处理程序中应用普遍。例如, C preprocessor C预处理器Internet Macros(iOpus) M4(如前所述,源于ATT,捆绑于Unix)
宏定义
c程序提供的预处理功能之一。包括带参数的宏定义和不带参数的宏定义。具体是指用一个指定的标志符来进行简单的字符串替换或者进行阐述替换。形式为:
#define标志符[(参数表)] 字符串
宏名
在上定义中的标志符被称为“宏名”。
宏展开
在c程序编译时将宏名替换成字符串的过程称为“宏展开”。
宏语言是一类编程语言,其全部或多数计算是由扩展宏完成的。宏语言并未在通用编程中广泛使用, 但在文本处理程序中应用普遍。例如,
C preprocessorC 预处理器
Internet Macros(iOpus)
M4(如前所述,源于ATT,捆绑于Unix)
参考资料来源:百度百科-宏
标题名称:c语言中宏替换函数 c语言中宏替换怎么算
分享URL:http://myzitong.com/article/hjjsoh.html