2

我需要在 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 语句的示例非常少,所以我被这部分困住了,我无法弄清楚如何将其转换为宏。谁能帮我解决上面的代码。

解决方案 :

我使用了内联函数而不是宏

4

3 回答 3

6
#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

还要注意在某些地方使用额外的括号来避免当statormsg是表达式时出现问题。

当然,要非常注意宏的所有缺陷——除非你有充分的理由,否则你真的不应该使用这种类型的函数宏。理想情况下,如果性能确实很关键,您应该使用内联函数,否则就坚持使用普通函数。

于 2013-08-23T09:47:13.750 回答
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-block 中两个语句之间的分隔符。

于 2013-08-23T09:46:58.737 回答
1
#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) ,您可以参考: http: //gcc.gnu.org/onlinedocs/cpp/Swallowing-the-Semicolon.html#Swallowing-the-Semicolon

于 2013-08-23T09:48:47.800 回答