Я хочу, чтобы одна из моих функций была встроена при ее использовании, но по какой-то причине я получаю ошибки, которые я не могу понять. Я быстро настраиваю тестовую среду для воспроизведения моей ошибки. Вот оно:Ошибка с встраиванием функции пространства имен
main.cpp:
#include "ns1.h"
#include <iostream>
int main()
{
if (Test::GiveMeCookies(false)){
std::cout << "Here it is!\n";
} else {
std::cout << "You were a bad boy!\n";
}
return 0;
}
ns1.cpp:
#include "ns1.h"
__forceinline bool Test::GiveMeCookies(bool why)
{
return !why;
}
ns1.h:
#pragma once
namespace Test
{
__forceinline bool GiveMeCookies(bool why);
}
Сообщение об ошибке я получаю:
1> main.obj: ошибка LNK2019: неразрешенный внешний символ "BOOL __cdecl Test :: GiveMeCookies (BOOL)" (GiveMeCookies @ Test @@ YA_N_N @ Z?) Ссылка в функции _main
1> C: \ Users \ Unknown User \ Desktop \ NamespaceTest \ Debug \ NamespaceTest.exe: фатальная ошибка LNK1120: 1 неразрешенных внешних
может кто-нибудь объяснить мне, почему я не могу встроенные функции из моего пространства имен? Как я могу обойти это, сохраняя при этом силу.
Почему, по-вашему, вам нужно «форсировать» инкрустацию? –
Чтобы дать компилятору шанс сращивания функции, определение должно быть видимым в точке, где вызывается функция. В противном случае он не может быть встроен и оставляет его в компоновщике, чтобы найти (не-встроенную) версию во время ссылки. Что, вероятно, означает (yuck!), Что ваш main.cpp должен включать ns1.cpp. – Peter
Вы понимаете, что если вы не включите LinkTimeOptimisation, если функция действительно находится в файле '.cpp', она НЕ будет встроена, спросите ли вы, чтобы она была силовой или иной. –