转自:http://blog.sina.com.cn/s/blog_5caa94a00100cnua.html
C语言之#define 函数
可以是用#define 替换函数语句;
#define GG(a, b, c, d, x, s, ac) { \
(a) += G((b), (c), (d)) + (x) + (UINT4)(ac); \
(a) = ROTATE_LEFT((a), (s)); \
(a) += (b); \
}
\ 表示强制换行,而换行后的内容与前一行的内容编译器仍把它看作是同一行.
编译器识别define的时候不是以分号结尾的,是以回车作为结束的。
#define后面定义的内容比须在同一行,而有时是为了让程序便于阅读,从中间进行换行,如果没有符号'\',则我们的换行表示#define的结束,这也是为什么你去掉后会报错的原因.如果在这里加了'\',也可以说是对"回车"的转义,表示这里有一个回车字符而已,#define并没有结束.而程序编译的时候,编译器会忽略掉这些'\回车'的字符.
讲得不好,表达能力不强呵呵,但仍希望你能了解.如果你会用LINUX系统的话,你用命令行中输入 ls \回车,系统也不会执行ls这个命令.它会认为你命令仍没有输完,会继续等待用户的输入.
define int 定义函数
int fun(int a,int b)
{
return (a+b)*(a-b);
}
void main(){
intd,x,y;
printf("inputx,y:");
scanf("%d%d",&x,&y);
d=fun(x,y);
printf("x*x-y*y=%d\n",d);
}
若写成define也可以 但保险一点的话应该写成
define fun(a,b) ((a)+(b))*((a)-(b))防止a,b是表达式形式
=========================================================
在学链表时,
书上定义
struct List{
int size;
......
};
struct List *list;
本该可以用
list->size
来读取信息;
为何书上还用
#define list_size(list) ((list)->size)
那么麻烦呢?
优点:可完成函数调用的功能,又能减少系统开销,提高运行效率。因为它是在预处理阶段即进行了宏展开,在执行时不需要转换,即在当地执行。
宏 代码在预处理期被简单替换, 类似于C++的内联函数
普通函数 多了申请栈,压栈,出栈,释放栈
比函数调用效率高,省去了参数的拷贝,直接替换。
缺点:所占用的目标代码空间相对较大
目标代码空间变大,不利于调试,还可能会导致隐含的错误
编译选项加/EP /P,重新编译,查看宏展开后对应的.i文件。
==========================================================
define 函数定义注意
代码
#include <errno.h> #include <math.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #define ADD(x, y) x + y #define MUL(x, y) x * y /* * === FUNCTION ====================================================================== * Name: main * Description: main function * ===================================================================================== */ int main ( int argc, char *argv[] ) { int a= 2, b = 3; printf ("\nProgram %d\n\n", MUL(ADD(a, b), 5) ); //被转换成2 + 3 * 5 注意 没有括号 故结果为17 return EXIT_SUCCESS; } /* ---------- end of function main ---------- */
output:
program 17