Функция определена в заголовочном файле? Так что фактический код задается непосредственно в функции, например:
static int addTwo(int x)
{
return x + 2;
}
Тогда это просто способ предоставления полезной функции для множества различных C-файлов. Каждый файл C, который включает в себя заголовок, получит свое собственное определение, которое он может вызвать. Это, конечно, тратит впустую память, и (на мой взгляд) это довольно уродливая вещь, так как наличие исполняемого кода в заголовке, как правило, не очень хорошая идея.
Помните, что #include
: при использовании заголовка в основном просто вставляется содержимое заголовка (и любые другие включенные в него заголовки) в файл C, как это видит компилятор. Компилятор никогда не знает, что одно конкретное определение функции пришло из заголовочного файла.
ОБНОВЛЕНИЕ : Во многих случаях это хорошая идея сделать что-то подобное выше, и я понимаю, что мой ответ звучит очень черно-белым об этом, что немного упрощает вещи. Например, код, который моделирует (или просто использует) встроенные функции , может быть выражен, как указано выше, и с явным ключевым словом inline
даже:
static inline int addTwo(int *x)
{
__add_two_superquickly(x);
}
Здесь функция __add_two_superquickly()
является вымышленной, и, поскольку мы хотим, чтобы вся функция в основном компилировалась в одну инструкцию, мы действительно хотим, чтобы она была встроенной. Тем не менее, вышеупомянутое чище, чем при использовании макроса.
Преимущество перед простым использованием встроенной функции, конечно, заключается в том, что оборачивание ее в другой уровень абстракции позволяет создавать код на компиляторах, не имеющих этой конкретной встроенной функции, путем предоставления альтернативной реализации и выбора правильной реализации в зависимости от того, какой компилятор используется.