首页
社区
课程
招聘
[旧帖] [求助] 宏 与 函数 区别 0.00雪花
发表于: 2013-1-13 13:23 1555

[旧帖] [求助] 宏 与 函数 区别 0.00雪花

2013-1-13 13:23
1555
今日在论坛闲逛,无意间在KSSD发现我寻找已久的详细Makefile文件教程。于是我便细读一番。于是便有了疑问,所谓宏与函数有什么区别于联系?我总觉得二者都是一个可以处理数据的模块。不知怎么区别,希望大牛能够明示。
在此我搜集了下百度资料:

所谓宏,就是一些命令组织在一起,作为一个单独命令完成一个特定任务。Microsoft Word中对宏定义为:“宏就是能组织到一起作为一独立的命令使用的一系列word命令,它能使日常工作变得更容易”。Word使用宏语言Visual Basic将宏作为一系列指令来编写。
计算机科学里的宏是一种抽象的,根据一系列预定义的规则替换一定的文本模式。Excel办公软件自动集成了“VBA”高级程序语言,用此语言编制出的程序就叫“宏”。使用“VBA”需要有一定的编程基础,并且还会耗费大量的时间,因此,绝大多数的使用者仅使用了Excel的一般制表功能,很少使用到“VBA”。 
解释器或编译器在遇到宏时会自动进行这一模式替换。对于编译语言,宏展开在编译时发生,进行宏展的工具常被称为宏展开器。宏这一术语也常常被用于许多类似的环境中,它们是源自宏展开的概念,这包括键盘宏和宏语言。绝大多数情况下,“宏”这个词的使用暗示着将小命令或动作转化为一系列指令。 
宏的用途在于自动化频繁使用的序列或者是获得一种更强大的抽象能力--但这常常是一回事。 
计算机语言如C或汇编语言有简单的宏系统,由编译器或汇编器的预处理器实现。C的宏预处理器的工作只是简单的文本搜索和替换,使用附加的文本处理语言如M4,C 程序员可以获得更精巧的宏。 
Lisp类语言如Common Lisp和Scheme有更精巧的宏系统: 宏的行为如同是函数对自身程序文本的变形,并且可以应用全部语言来表达这种变形。一个C宏可以定义一段语法的替换,然而一个Lisp的宏却可以控制一节代码的计算。获得了控制代码的执行顺序(见惰性计算和非限制函数)的能力,使得新创建的语法结构与语言内建的语法结构不可区分。例如,一种Lisp 方言有 cond 而没有if ,就可以使用宏由前者定义后者。Lisp 语法的去部主要扩展,比如面向对象的CLOS 系统,可以由宏来定义。


函数
函数(function)表示每个输入值对应唯一输出值的一种对应关系。函数f中对应输入值的输出值x的标准符号为f(x)。包含某个函数所有的输入值的集合被称作这个函数的定义域,包含所有的输出值的集合被称作值域。若先定义映射的概念,可以简单定义函数为,定义在非空数集之间的映射称为函数。

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 80
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
看看 了解下知识
2013-1-13 13:35
0
雪    币: 36
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
似乎是宏方便些    然后由于宏在运行时会解压(术语忘了)  很占内存  大概就这样 百度好多资料  

宏和函数交替使用嘛~~
2013-1-13 22:33
0
雪    币: 5
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我晕了,分析有理呀
2013-1-13 22:53
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
宏是在编译的时候,自动替换的。相当于符号级别的等量置换。而函数是有调用关系的,需要传入具体参数,传出具体参数,返回值之类的。另外在宏里的代码是直接编到程序里。在程序里已经看不到宏的符号了。而函数是在程序里实实在在存在的,是在堆上可以运行的。
2013-1-14 16:44
0
雪    币: 166
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
这个主要看一下汇编应该就理解两者区别了
2013-1-14 16:57
0
雪    币: 3366
活跃值: (1333)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
7
可否贴出例程?给出解释?我分析老是找不到main函数在哪,没法分析。
2013-1-14 17:36
0
雪    币: 166
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
#include <stdio.h>
#define  ADD(a,b)        a+b

int fun(int a,int b)
{
        return a+b;
}
int main()
{
        int a = 1,b = 2;
        int sum = 0;
        sum= fun(a,b);
        sum = 0;
        sum = ADD(a,b);

        return 0;
}
反汇编
8:    int main()
9:    {
0040D490   push        ebp
0040D491   mov         ebp,esp
0040D493   sub         esp,4Ch
0040D496   push        ebx
0040D497   push        esi
0040D498   push        edi
0040D499   lea         edi,[ebp-4Ch]
0040D49C   mov         ecx,13h
0040D4A1   mov         eax,0CCCCCCCCh
0040D4A6   rep stos    dword ptr [edi]
10:       int a = 1,b = 2;
0040D4A8   mov         dword ptr [ebp-4],1
0040D4AF   mov         dword ptr [ebp-8],2
11:       int sum = 0;
0040D4B6   mov         dword ptr [ebp-0Ch],0
12:       sum= fun(a,b);
0040D4BD   mov         eax,dword ptr [ebp-8]
0040D4C0   push        eax
0040D4C1   mov         ecx,dword ptr [ebp-4]
0040D4C4   push        ecx
0040D4C5   call        @ILT+10(fun) (0040100f)
0040D4CA   add         esp,8
0040D4CD   mov         dword ptr [ebp-0Ch],eax
13:       sum = 0;
0040D4D0   mov         dword ptr [ebp-0Ch],0
14:       sum = ADD(a,b);
0040D4D7   mov         edx,dword ptr [ebp-4]
0040D4DA   add         edx,dword ptr [ebp-8]
0040D4DD   mov         dword ptr [ebp-0Ch],edx
15:
16:       return 0;
0040D4E0   xor         eax,eax
17:   }
2013-1-14 18:05
0
雪    币: 166
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
sum= fun(a,b);
0040D4BD   mov         eax,dword ptr [ebp-8]
0040D4C0   push        eax
0040D4C1   mov         ecx,dword ptr [ebp-4]
0040D4C4   push        ecx
0040D4C5   call        @ILT+10(fun) (0040100f)
0040D4CA   add         esp,8
0040D4CD   mov         dword ptr [ebp-0Ch],eax
这些是函数部分的汇编

:       sum = ADD(a,b);
0040D4D7   mov         edx,dword ptr [ebp-4]
0040D4DA   add         edx,dword ptr [ebp-8]
0040D4DD   mov         dword ptr [ebp-0Ch],edx
这是那个宏
2013-1-14 18:08
0
游客
登录 | 注册 方可回帖
返回
//