Sdílet prostřednictvím


Problémy vložené funkce

Pokud používáte vkládání funkcí, musíte:

  • Mají vložené funkce implementované v souboru záhlaví, který zahrnete.

  • V souboru záhlaví je zapnuté vkládání.

// LNK2019_function_inline.cpp
// compile with: /c
// post-build command: lib LNK2019_function_inline.obj
#include <stdio.h>
struct _load_config_used {
   void Test();
   void Test2() { printf("in Test2\n"); }
};

void _load_config_used::Test() { printf("in Test\n"); }

A pak,

// LNK2019_function_inline_2.cpp
// compile with: LNK2019_function_inline.lib
struct _load_config_used {
   void Test();
   void Test2();
};

int main() {
   _load_config_used x;
   x.Test();
   x.Test2();   // LNK2019
}

Pokud používáte direktivu kompilátoru #pragma inline_depth , ujistěte se, že máte nastavenou hodnotu 2 nebo vyšší. Hodnota nuly vypne vkládání. Ujistěte se také, že používáte možnosti kompilátoru /Ob1 nebo /Ob2 .

Kombinování možností vložené a neline kompilace v různých modulech může někdy způsobit problémy. Pokud je vytvořena knihovna C++ se zapnutou funkcí (/Ob1 nebo /Ob2), ale odpovídající soubor hlaviček popisující funkce má vypnuté vkládání (bez možnosti), zobrazí se chyba LNK2001. Funkce se do kódu ze souboru hlavičky nevkládají, ale protože nejsou v souboru knihovny, neexistuje žádná adresa k vyřešení odkazu.

Podobně projekt, který používá inlining funkcí, ale definuje funkce v souboru .cpp místo v souboru hlaviček také LNK2019. Soubor hlavičky je zahrnut všude, kde se považuje za vhodné, ale funkce jsou vloženy pouze v případě, že .cpp soubor prochází kompilátorem; proto linker při použití v jiných modulech vidí funkce jako nevyřešené externí prvky.

// LNK2019_FIP.h
struct testclass {
   void PublicStatMemFunc1(void);
};

a pak,

// LNK2019_FIP.cpp
// compile with: /c
#include "LNK2019_FIP.h"
inline void testclass::PublicStatMemFunc1(void) {}

a pak,

// LNK2019_FIP_2.cpp
// compile with: LNK2019_FIP.cpp
// LNK2019 expected
#include "LNK2019_FIP.h"
int main() {
   testclass testclsObject;

   // module cannot see the implementation of PublicStatMemFunc1
   testclsObject.PublicStatMemFunc1();
}

Viz také

Chyba linkerů LNK2019