Проблемы при встраивании функций

Обновлен: Ноябрь 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();
}

См. также

Ссылки

Ошибка средств компоновщика LNK2019