2013-08-23 80 views
1

我需要用C编写一个宏,而不是一个函数的C函数宏

的功能如下:

void FSTATUS(int stat,char msg[]) 
{ 
    if(stat != 0) 
    { 
     EMH_ask_error_text(stat, &msg); 
     printf("Error : \"%d\",\"%s\"\n",stat,msg); 
    } 
    else 
     printf("\n -------- %s -------- \n",msg); 
} 

,因为有可如何if语句中使用非常少的例子宏,我坚持这部分,我无法弄清楚如何将其转换为宏。任何人都可以请帮我拿出上面的代码。

解决方案:

我用来代替宏

+0

是什么让你觉得这需要一个宏? –

+0

我需要将它称为宏来减少编译时间 – Neal

+5

哦,您不会减少编译时间,如果您使用宏,则可以增加编译时间。请记住,在编译之前,宏正在扩展到源代码中。 –

回答

4

正确的格式的内联函数,使一个巨大的差异,我相信。这就是为什么我总是对齐\的原因。

#define FSTATUS(stat, msg)        \ 
do              \ 
{               \ 
    if ((stat) != 0)          \ 
    {              \ 
     EMH_ask_error_text((stat), &(msg));    \ 
     printf("Error : \"%d\",\"%s\"\n", (stat), (msg)); \ 
    }              \ 
    else             \ 
    {              \ 
     printf("\n -------- %s -------- \n", (msg));  \ 
    }              \ 
}               \ 
while (0) 

要点:确保有在线条的末端\后面没有空格。白色空间“打破”了换行符。

当然,你也可以这样做:

#define FSTATUS(s, m) ((s) ? (EMH_ask_error_text((s), &(m)), printf("Error : \"%d\",\"%s\"\n", (s), (m))) : printf("\n -------- %s -------- \n", (m))) 

这里逗号运算符是用来作为if - 阻塞两种说法之间的分隔符。

5
#define FSTATUS(stat, msg) do \ 
{ \ 
    if((stat) != 0) \ 
    { \ 
     EMH_ask_error_text(stat, &(msg)); \ 
     printf("Error : \"%d\",\"%s\"\n",stat,msg); \ 
    } \ 
    else \ 
     printf("\n -------- %s -------- \n",msg); \ 
} while (0) 

注意使用do { ... } while (0)确保这一工作正常if/else之间。

还请注意在某些地方使用附加的括号以避免statmsg是表达式时出现的问题。

当然要非常了解宏的所有缺陷 - 除非有很好的理由,否则不应该使用这种类型的函数宏。理想情况下,如果性能确实很重要,则应该使用内联函数,否则只需使用正常函数即可。

+1

很好的诀窍(0):)。 –

+0

感谢您的答案..我传递的参数是int stat和char msg [],即一个数组..所以我怎么传递一个数组? – Neal

+0

我试过了#define FSTATUS(int stat,char [] msg),但是它显示了一个语法错误 – Neal