C++ внешнее определение встроенной функции

Я пытаюсь определить функцию в файле 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;
}

В стандарте нет гарантии, что объявление встроенной функции приведет к встроенному коду. Однако вы можете объявлять и определять встроенные функции, если для каждой единицы перевода существует только одно определение. Они также должны быть одинаковыми, если используются в нескольких единицах перевода. Такие вещи, как __forceinline, являются расширениями компилятора.

doug 01.09.2018 07:04

Да, @doug, в этом есть смысл. Что касается конкретного компилятора, поэтому у меня есть тег MSVC++. Отдельно хочу остановиться на квалификаторе __forceinline

user10214010 01.09.2018 07:13

См. Также: stackoverflow.com/questions/151919/…

Will Bickford 01.09.2018 07:46

Обратите внимание, что MSVC++ не гарантирует, что __forceinline фактически встроит функцию. см .: msdn.microsoft.com/library/…

doug 01.09.2018 08:03

Я использую его для правильного использования квалификатора __forceinline. Я понимаю отсутствие гарантии и знаю причины этого. Я как следует избегаю этого. Тем не менее, я до сих пор не знаю, следует ли мне вообще использовать extern или как правильно определить, что определение находится в файле cpp, а не в файле заголовка.

user10214010 01.09.2018 08:10

По умолчанию объявления функций имеют внешнюю связь.

molbdnilo 01.09.2018 09:55
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
6
288
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Функция, объявленная по умолчанию как __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 по-прежнему встроить его?

Niklas R 01.09.2018 09:59

@NiklasR, да. Я специально проверил, прежде чем писать ответ.

Evg 01.09.2018 10:05

В настоящее время я использую extern __forceinline void foo(); в моем заголовке и __forceinline void foo(){} в моем файле cpp, и у меня нет ошибки связывания. требуется ли встроенный спецификатор в файле заголовка? как я могу проверить, встроена ли функция? или вы знаете, что это правильно?

user10214010 01.09.2018 21:55

@CryptographyMan Вам не нужен extern __forceinline в шапке. Самый простой способ проверить, встроена ли функция, - это посмотреть на сгенерированный ассемблерный код. Поместите точку останова где-нибудь перед вызовом функции, а затем проверьте окно Разборка. Не забудьте переключиться в режим выпуска.

Evg 01.09.2018 22:00

Другие вопросы по теме