C Language
Встраивание
Поиск…
Функции вложения, используемые в более чем одном исходном файле
Для небольших функций, вызываемых часто, служебные данные, связанные с вызовом функции, могут быть значительной частью общего времени выполнения этой функции. Таким образом, одним из способов повышения производительности является устранение накладных расходов.
В этом примере мы используем четыре функции (плюс main()
) в трех исходных файлах. Два из них ( plusfive()
и timestwo()
) каждый вызываются двумя другими, расположенными в «source1.c» и «source2.c». main()
включен, поэтому у нас есть рабочий пример.
main.c:
#include <stdio.h>
#include <stdlib.h>
#include "headerfile.h"
int main(void) {
int start = 3;
int intermediate = complicated1(start);
printf("First result is %d\n", intermediate);
intermediate = complicated2(start);
printf("Second result is %d\n", intermediate);
return 0;
}
source1.c:
#include <stdio.h>
#include <stdlib.h>
#include "headerfile.h"
int complicated1(int input) {
int tmp = timestwo(input);
tmp = plusfive(tmp);
return tmp;
}
source2.c:
#include <stdio.h>
#include <stdlib.h>
#include "headerfile.h"
int complicated2(int input) {
int tmp = plusfive(input);
tmp = timestwo(tmp);
return tmp;
}
headerfile.h:
#ifndef HEADERFILE_H
#define HEADERFILE_H
int complicated1(int input);
int complicated2(int input);
inline int timestwo(int input) {
return input * 2;
}
inline int plusfive(int input) {
return input + 5;
}
#endif
Функции timestwo
и plusfive
вызываются как complicated1
и complicated2
, которые находятся в разных «единицах перевода» или исходных файлах. Чтобы использовать их таким образом, мы должны определить их в заголовке.
Скомпилируйте это, предположив gcc:
cc -O2 -std=c99 -c -o main.o main.c
cc -O2 -std=c99 -c -o source1.o source1.c
cc -O2 -std=c99 -c -o source2.o source2.c
cc main.o source1.o source2.o -o main
Мы используем опцию оптимизации -O2, потому что некоторые компиляторы не встроены без оптимизации.
Эффект ключевого слова inline
заключается в том, что соответствующий символ функции не попадает в объектный файл. В противном случае в последней строке будет возникать ошибка, когда мы связываем объектные файлы с окончательным исполняемым файлом. Если бы у нас не было inline
, один и тот же символ был бы определен в обоих файлах .o
, и возникла бы ошибка «с несколькими символами».
В ситуациях, когда символ действительно необходим, это имеет тот недостаток, что символ вообще не создается. Есть две возможности справиться с этим. Первое заключается в добавлении дополнительного выражения extern
для встроенных функций в один из файлов .c
. Поэтому добавьте следующее в source1.c
:
extern int timestwo(int input);
extern int plusfive(int input);
Другая возможность - определить функцию со static inline
а не inline
. Этот метод имеет недостаток, что в конечном итоге копия рассматриваемой функции может быть создана в каждом объектном файле, который создается с этим заголовком.