宏函数的写法

宏函数有执行较快,但占用代码长度较大,且不易调试的特点

对于运算型的宏函数,可以写成

#define f(a,b)   ((a)+(b))

宏函数中所有的参数都应该加小括号保证a,b先运算完毕,宏函数的最外面应该再加一层小括号保证宏函数整体运算

对于复杂的,需要调用其他函数的宏函数,则应该使用大括号把他们包在一起,避免如if之类的语句,只执行到第一句。

#define F(a,b)  {  \
          f(a);          g(b);          }  

其中反斜线是为了满足宏函数定义在一行内的要求。    

但这边又出现另外一个问题,对于一些语句,比如if(x) F(a,b) else...中要求if中带的语句只能有一个,如果使用上述形式,展开后变成

if (x)
{
    f(a);
    f(b);
};
else
...

多了一个分号,不符合语法规范。显然是两个语句,违反了语法规定,因此,需要在大括号外面套一个后面还可以接分号的语句,常见的是do{}while(0);

最后的形式是:

#define F(a,b)  do{  \

          f(a);
          g(b);
          }while(0)

展开后的形式是

if ( x )
      do { f(a);    f(b);    } while(0);
else    ...

参考:

C 宏定义的简单总结

http://dxf206.blog.163.com/blog/static/4227861200952511813462/

宏函数的写法

时间: 2024-07-31 17:28:22

宏函数的写法的相关文章

IOS学习之路-- 指针&宏函数

如果*p被()包住,说明指针变量p将来指向的是函数 //声明一个指针变量 //int (*p)(int, int) = sum; int (*p)(int, int); p = sum; // 如果*p被()包住,说明指针变量p将来指向的是函数 // 最左边的void说明p指向的函数没有返回值 // 最右边的()说明p指向的函数没有形参 void (*p)(); // 函数名test就是test函数的地址 // 将test函数的地址赋值给了指针变量p // 指针变量p成功指向了test函数 p

#define定义宏函数 的正确使用

如何使用宏来定义一个自定义函数呢?首先我们来看下面这段代码 #define SQUARE(x) x*x int main() { int a = 5; printf("SQUARE(a): %d\n",SQUARE(a)); //这个值为25 printf("SQUARE(a+1): %d\n", SQUARE(a + 1)); //第一反应是打印36,其实打印的是11 } 运行结果:为什么会出现这样的结果呢?原因是编译器在处理SQUARE(a+1)的时候,处理成了

教教大家一些strcpy,strcmp,strcat,strlen函数的写法

VC源码: strcmp函数的写法: #include<stdio.h> #include<string.h> int strcmp1(char* a, char* b) { for(;*a==*b;a++,b++) if(*a!='\0') return 0; return *a - *b; } main() {  int l; char a[10]={"db"}; char b[10]={"cb"}; l=strcmp1(a,b); pr

jQuery扩展插件和拓展函数的写法

<script type="text/JavaScript">            //jQuery插件的写法(需要传入操作对象)        ;(function($)        {            //PI_TestPlugIn为插件名称,也是插件的操作对象            //为了不会与其它插件名重复,这里我使用PlugIn的缩写PI_来定义插件对象前缀            $.fn.PI_TestPlugIn=               { 

关于宏函数的定义

以前一直以为宏的定义挺简单的,没有写过长的宏函数,最常用的是MAX()的定义,今天写一个宏函数的时候,相对于MAX()来说,稍微有点长,然后踩了一个小坑. 一开始将宏函数定义的时候,为了书写方便,将一个函数写成了几行,但是没有用连接符号连接起来,类似于下面 1 #define CHECK(ret) ({ 2 int ret; 3 ... 4 }) GCC总是提示ret不在范围内.想了半天没有明白怎么回事. 然后我发现了一个问题. 我的VIM定义宏函数时,#define那一行是显示的蓝色,但是我的

C99 中 main 函数的写法

今天在论坛看见有人讨论 C 语言中 Main 函数的写法,看到结论才知道 Main 函数的正确写法. 被老谭酸菜坑了这么多年,还是记录下吧,或许以后某天不搞 .net,回去折腾 C 语言了. 写法1: 1 int main(void) 2 { 3 // TODO 4 return 0; 5 } 写法2: 1 int main(int argc, char *argv[]) 2 { 3 // TODO 4 return 0; 5 } 两种写法都是符合 C99 标准的,当然第二种是适用范围更广泛.

宏函数定义继承类

//: ORDER.CPP -- Order of constructor calls // with inheritance #include <iostream.h> #define inherit(derived, base) class derived : public base { public: derived() { cout << #derived << endl; } }; class X {}; inherit(A, X) inherit(B, A)

C语言宏函数参数的连接

#include<stdio.h> #define Calculate_Max(A,B) A>B?A:B #define Calculate_Min(A,B) A<B?A:B #define Calculate(A,B,NAME) Calculate_##NAME(A,B) int main(void) {         printf("%d\n",Calculate(5,8,Max));         return 0; } 使用宏函数或者宏函数时,注意如

1013-----C语言----------几个va_宏函数的使用

最近在看APUE附带的源码时,看到它的错误处理文件中用到了可变参数列表(如下),正好最近老是看到这几个函数在眼前晃悠,所以就做个了断吧.哈哈. #include "apue.h" #include <errno.h> /* for definition of errno */ #include <stdarg.h> /* ISO C variable aruments */ static void err_doit(int, int, const char *,