2015-12-30 7 views
2

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

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 неразрешенных внешних

может кто-нибудь объяснить мне, почему я не могу встроенные функции из моего пространства имен? Как я могу обойти это, сохраняя при этом силу.

+0

Почему, по-вашему, вам нужно «форсировать» инкрустацию? –

+0

Чтобы дать компилятору шанс сращивания функции, определение должно быть видимым в точке, где вызывается функция. В противном случае он не может быть встроен и оставляет его в компоновщике, чтобы найти (не-встроенную) версию во время ссылки. Что, вероятно, означает (yuck!), Что ваш main.cpp должен включать ns1.cpp. – Peter

+1

Вы понимаете, что если вы не включите LinkTimeOptimisation, если функция действительно находится в файле '.cpp', она НЕ будет встроена, спросите ли вы, чтобы она была силовой или иной. –

ответ

2

Ошибка, которую вы получаете, не связана с forceinline. В ns1.cpp ваша функция не находится в пространстве имен Test.

это должно быть так:

#include "ns1.h" 
namespace Test 
{ 
    __forceinline bool GiveMeCookies(bool why) 
    { 
     return !why; 
    } 
} 
+1

Почти. Вытащите это 'Test ::'. Я не могу объяснить, почему этот файл даже компилируется ... –

+0

Зачем мне проходить этот тест :: out? Это указывает на то, что я хочу определить функцию из пространства имен Test, в соответствии с: https://msdn.microsoft.com/en-us/library/5cb46ksf.aspx –

+0

Niclas, и это не работает, если я не расширю все в своем заголовок. (Только что выяснилось недавно) –

0

Добавление экстерном в заголовок, кажется, решить эту ситуацию, однако я должен вырыть в нее глубже, чтобы проверить, если он действительно Внутристрочные. Если нет, то я думаю, что мы не можем делать никаких дальнейших шагов, поэтому, вероятно, это лучшее решение:

#pragma once 

namespace Test 
{ 
    extern __forceinline bool GiveMeCookies(bool why); 
} 
Смежные вопросы