Problèmes de fonctions inline
Mise à jour : novembre 2007
Function Inlining Problems
Si vous utilisez la fonctionnalité inline, vous devez :
Implémenter les fonctions inline dans le fichier d'en-tête inclus.
Activer la fonctionnalité inline dans le fichier d'en-tête.
// 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"); }
Ensuite,
// 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
}
Si vous utilisez la directive du compilateur #pragma inline_depth, vérifiez que vous utilisez une valeur supérieure ou égale à 2. Une valeur zéro désactive la fonctionnalité inline. Vérifiez aussi que vous utilisez les options du compilateur /Ob1 ou /Ob2.
Le mélange d'options de compilation en ligne et non en ligne sur des modules différents peut parfois causer des problèmes. Si une bibliothèque C++ est créée avec la fonctionnalité inline activée (/Ob1 ou /Ob2), alors que le fichier d'en-tête correspondant décrivant les fonctions a désactivé cette fonctionnalité (sans option), l'erreur LNK2001 survient. Les fonctions ne sont pas incluses en ligne dans le code à partir du fichier d'en-tête, mais comme elles ne sont pas dans le fichier de bibliothèque, il n'y a pas d'adresse pour résoudre la référence.
De même, un projet qui utilise la fonctionnalité inline de fonction mais définit les fonctions dans un fichier .cpp au lieu du fichier d'en-tête peut générer l'erreur LNK2019. Le fichier d'en-tête est inclus partout où cette inclusion est considérée comme appropriée, mais les fonctions ne sont incluses que quand le fichier .cpp passe dans le compilateur ; l'éditeur de liens voit donc les fonctions comme des externes non résolus si elles sont utilisées dans d'autres modules.
// LNK2019_FIP.h
struct testclass {
void PublicStatMemFunc1(void);
};
et ensuite,
// LNK2019_FIP.cpp
// compile with: /c
#include "LNK2019_FIP.h"
inline void testclass::PublicStatMemFunc1(void) {}
et ensuite,
// 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();
}