#include "another_source.c", используйте встроенную функцию (), затем функция () также становится встроенной? - PullRequest
0 голосов
/ 13 октября 2018

Допустим, у меня есть два файла с именами "AA.c", "BB.c"

/* in AA.c */

inline void AA(void) __attribute__((always_inline));
void AA()
{
    /* do something */
}

, а затем

/* in BB.c */
#include "AA.c"

extern void funcAA(void);
int main(void)
{
    funcAA();

    return 0;
}

делает ли funcAA () встроенным ???

Независимо от того, ответ на этот вопрос - да или нет, не могли бы вы рассказать немного больше о «под капотом»?

1 Ответ

0 голосов
/ 13 октября 2018

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

Вы можете увидеть, что такое компиляторсобирается скомпилировать, пытаясь скомпилировать ваш файл с флагом -E (вывод препроцессора).Вы увидите, что ваша функция вставлена.

Так что она будет встроенной только из-за ключевого слова inline и будет принудительно установлена ​​с атрибутом always_inline, даже если компилятор отказался бы встроить ее из-занапример, размер функции.

Совет: знайте, что вы делаете, когда включаете файл .c из другого файла.Некоторые сборочные системы / make-файлы просто сканируют каталоги в поисках файлов с именем *.c, чтобы они могли скомпилировать их отдельно.Размещение там, возможно, некомпилируемого C-файла может привести к сбою сборки, и, если он собирается, у вас могут появиться повторяющиеся символы при компоновке.Только не делайте этого.

Если вы хотите сделать это, поместите вашу функцию в файл .h и объявите его static, чтобы он не потерпел неудачу при ссылке, если включен во многие файлы .c(каждая функция будет выглядеть как другая)

...