Condividi tramite


Problemi di inline di funzioni

Se si usa l'inlining della funzione, è necessario:

  • Le funzioni inline sono implementate nel file di intestazione incluso.

  • L'inlining è attivato nel file di intestazione.

// 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"); }

E quindi,

// 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
}

Se si usa la direttiva del #pragma inline_depth compilatore, assicurarsi di avere un valore pari o superiore a 2. Un valore pari a zero disattiva l'inlining. Assicurarsi anche di usare le opzioni del compilatore /Ob1 o /Ob2 .

La combinazione di opzioni di compilazione inline e non inline in moduli diversi può talvolta causare problemi. Se viene creata una libreria C++ con l'inlining della funzione attivata (/Ob1 o /Ob2), ma il file di intestazione corrispondente che descrive le funzioni è disattivato (nessuna opzione), verrà visualizzato l'errore LNK2001. Le funzioni non vengono inlinedi nel codice dal file di intestazione, ma poiché non si trovano nel file di libreria non esiste alcun indirizzo per risolvere il riferimento.

Analogamente, un progetto che usa l'inlining di funzioni definisce ancora le funzioni in un file .cpp anziché nel file di intestazione otterrà anche LNK2019. Il file di intestazione viene incluso ovunque considerato appropriato, ma le funzioni vengono inlinate solo quando il file .cpp passa attraverso il compilatore; pertanto, il linker vede le funzioni come esterni non risolti quando vengono usati in altri moduli.

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

E poi

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

E poi

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

Vedi anche

Errore degli strumenti del linker LNK2019