Проблемы при встраивании функций
Обновлен: Ноябрь 2007
Function Inlining Problems
При использовании процедуры встраивания функций необходимо:
Реализовать встроенные функции во включенном файле заголовка.
Включить функциональную возможность встраивания в файле заголовка.
// 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"); }
А затем
// 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
}
При использовании директивы компилятора #pragma inline_depth необходимо задать значение, равное или больше 2. При значении, равном нулю, функциональная возможность встраивания отключена. Кроме того, необходимо использовать параметры компилятора /Ob1 или /Ob2.
Одновременное использование встроенных и невстроенных параметров компилятора для различных модулей может в отдельных случаях стать причиной возникновения проблем. Если при создании библиотеки C++ функциональная возможность встраивания включена (/Ob1 или /Ob2), но та же функциональная возможность в соответствующем файле заголовка с описанием функций отключена (нет параметров), возникает ошибка LNK2001. Функции не встраиваются в код из файла заголовка, но, поскольку они не находятся в файле библиотеки, адреса для разрешения ссылки не существует.
Ошибка LNK2019 также возникнет, если проект, использующий встраивание функций, определяет эти функции в CPP-файле, а не в файле заголовка. Файл заголовка включается при необходимости везде, но встраивание функций происходит только в том случае, если CPP-файл передает данные в компилятор; таким образом, при использовании в других модулях компоновщик будет видеть эти функции в виде неразрешенных внешних ссылок.
// LNK2019_FIP.h
struct testclass {
void PublicStatMemFunc1(void);
};
а затем
// LNK2019_FIP.cpp
// compile with: /c
#include "LNK2019_FIP.h"
inline void testclass::PublicStatMemFunc1(void) {}
а затем
// 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();
}