extern inline vs #define macro - PullRequest
       4

extern inline vs #define macro

1 голос
/ 04 марта 2020

Недавно я обнаружил кодовую базу, которая поддерживает использование макросов вместо внешних встроенных функций. Используемый здесь язык - C99, а конкретная реализация c особенно чувствительна к производительности (и поэтому аргумент, приведенный для использования макросов, заключается в том, чтобы избежать вызовов функций / установки фрейма стека для часто вызываемых функций).

В качестве улучшения читабельности я предложил удалить макрос в пользу внешних встроенных функций. Например, вместо:

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

Я предлагаю:

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

При просмотре сгенерированной сборки моя функция выглядит правильно встроенной и, следовательно, такой же эффективной, как и макрос в то время как его легче читать и отлаживать.

Есть ли какие-либо соображения о выделении функций, которые я пропускаю? Есть ли другие преимущества использования макросов, которые я не рассматриваю?

1 Ответ

1 голос
/ 04 марта 2020

extern inline функции будут вызывать излучение внешних символов. Макросы видны только с той точки, в которой они были определены. Если вы поместили функцию extern inline в заголовочный файл, а два исходных файла .c содержат этот заголовок, то ваш компоновщик должен выдать ошибку «несколько определений одной и той же функции».

Использовать static inline для замена макросов.

...