C函数到宏

Nea*_*eal 1 c macros function

我需要在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);
}
Run Code Online (Sandbox Code Playgroud)

因为有很少的例子可用如何在宏中使用if语句,我被困在这部分,我无法弄清楚如何将其转换为宏.任何人都可以帮我解决上面的代码.

方案:

我使用内联函数而不是宏

Pau*_*l R 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)
Run Code Online (Sandbox Code Playgroud)

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

还要注意在某些地方使用额外的括号,以避免在表达式statmsg表达式时出现问题.

当然要非常清楚宏的所有缺陷 - 除非你有充分的理由,否则你真的不应该使用这种类型的函数宏.理想情况下,如果性能真的很重要,你应该使用内联函数,否则只需坚持正常的功能.

  • @Neal:对于宏,您没有指定参数类型 - 所以您显然会失去使用函数获得的类型检查。由您来提供正确的论据。一般来说,这种类型的宏是一个坏主意(出于这个原因和许多其他原因),但希望你知道你在做什么...... (2认同)
  • @lulyon do while循环允许你做两件事:1.将调用写入常规函数调用宏; 最后,没有关于空陈述的警告; 2.(在这种情况下不适用)如果你有任何只在宏体内需要的局部变量,它会为你提供一个块范围来定义它们. (2认同)