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();
}