首页 > 解决方案 > extern 内联 vs #define 宏

问题描述

我最近遇到了一个代码库,它倾向于使用宏而不是外部内联函数。这里使用的语言是 C99,具体实现对性能特别敏感(因此使用宏给出的参数是为了避免频繁调用函数的函数调用/堆栈帧设置)。

为了提高可读性,我建议删除宏以支持外部内联函数。例如,而不是:

#define FooBar(_AnArg, _AnotherArg)                      \
{                                                        \
    if (_AnotherArg)                                     \
    {                                                    \
        ...                                              \
    }                                                    \
    else                                                 \
    {                                                    \
        ...                                              \
    }                                                    \
}

我建议:

extern inline void FooBar(void* anArg, bool anotherArg) {
   ...
}

查看生成的程序集,我的函数似乎已正确内联,因此与宏一样有效,同时更易于阅读和调试。

有没有考虑我忽略的函数内联?我没有考虑使用宏的其他好处吗?

标签: cc99

解决方案


extern inline函数将导致发出外部符号。宏仅在定义时可见。如果您将extern inline函数放在头文件中并且两个.c源文件包含该头文件,那么您的链接器应该抱怨“同一函数的多个定义”错误。

用于static inline替换宏。


推荐阅读