Я пытаюсь определить функцию в файле CPP, которая объявлена вперед в файле заголовка. Я хотел бы знать, как это сделать, поскольку все, что я пробовал, компилируется и запускается, и мои навыки анализа недостаточно хороши, чтобы исследовать, действительно ли функции встроены.
Вот что я хотел бы сделать
/// Source.h
void inlined_func(); // what specifiers should I put here?
// I was thinking about doing both `extern` and `__forceinline`
/// Source.cpp
__forceinline void inlined_func()
{
std::cout << "we're in the inlined func" << std::endl;
}
Да, @doug, в этом есть смысл. Что касается конкретного компилятора, поэтому у меня есть тег MSVC++. Отдельно хочу остановиться на квалификаторе __forceinline
См. Также: stackoverflow.com/questions/151919/…
Обратите внимание, что MSVC++ не гарантирует, что __forceinline фактически встроит функцию. см .: msdn.microsoft.com/library/…
Я использую его для правильного использования квалификатора __forceinline. Я понимаю отсутствие гарантии и знаю причины этого. Я как следует избегаю этого. Тем не менее, я до сих пор не знаю, следует ли мне вообще использовать extern или как правильно определить, что определение находится в файле cpp, а не в файле заголовка.
По умолчанию объявления функций имеют внешнюю связь.





Функция, объявленная по умолчанию как __forceinline, получает внутреннюю привязку (имя может упоминаться только в текущей единице перевода), как если бы она была объявлена как static. Если вы попытаетесь использовать его в другой единице перевода, вы получите ошибку компоновщика LNK2001 unresolved external symbol .... Чтобы принудительно установить внешнюю связь, чтобы на нее можно было ссылаться в других единицах перевода, используйте ключевое слово extern.
foo.h
void foo();
foo.cpp
#include <foo.h>
extern __forceinline void foo() {
/*...*/
}
main.cpp
#include <foo.h>
int main() {
foo();
}
Может ли MSVC по-прежнему встроить его?
@NiklasR, да. Я специально проверил, прежде чем писать ответ.
В настоящее время я использую extern __forceinline void foo(); в моем заголовке и __forceinline void foo(){} в моем файле cpp, и у меня нет ошибки связывания. требуется ли встроенный спецификатор в файле заголовка? как я могу проверить, встроена ли функция? или вы знаете, что это правильно?
@CryptographyMan Вам не нужен extern __forceinline в шапке. Самый простой способ проверить, встроена ли функция, - это посмотреть на сгенерированный ассемблерный код. Поместите точку останова где-нибудь перед вызовом функции, а затем проверьте окно Разборка. Не забудьте переключиться в режим выпуска.
В стандарте нет гарантии, что объявление встроенной функции приведет к встроенному коду. Однако вы можете объявлять и определять встроенные функции, если для каждой единицы перевода существует только одно определение. Они также должны быть одинаковыми, если используются в нескольких единицах перевода. Такие вещи, как __forceinline, являются расширениями компилятора.