Встраивание методов класса в статическую библиотеку
В этом вопросе ответ гласит, что для встраивания функции для статической библиотеки, функция объявляется inline
в заголовочном файле и extern
в исходном файле. Однако в C++, если это сделано, ошибка компилятора (Redeclaration of member is not allowed
) генерируется. Как правильно написать функцию, чтобы она работала так же, как в посте C?
Заголовок:
class Int64
{
uint64_t a;
public:
inline void flip() { a = ~a; }
};
Источник:
extern void Int64::flip(); // redeclaration of member is not allowed
1 ответ
В C++ вы можете объявить функцию как inline
только если код функции доступен во время компиляции (если вы действительно хотите встроить этот код функции). Таким образом, вы не можете реализовать тело функции внутри скомпилированной статической библиотеки, которая не будет доступна при использовании этой статической библиотеки. Если вы это сделаете, этот вызов функции будет похож на обычный вызов функции.
Из контекста:
2) Определение встроенной функции должно присутствовать в единице перевода, к которой она осуществляется (не обязательно до точки доступа).
Хотя, вы можете определить свой inline
функция в заголовке вашей статической библиотеки (как функция только заголовка).
Кстати, помните, что inline
это просто предложение. Компилятор решит встроить или нет. Обычно это происходит, когда вы компилируете код с включенной оптимизацией, но особенно если вы не оптимизируете свой код, вы обычно видите, что функции не встроены.
В качестве примера, проверьте эту небольшую статическую библиотеку, содержащую 2 файла:
test.h:
#pragma once
inline int sum(int a, int b)
{
return a + b;
}
int sub(int a, int b);
test.cpp:
int sub(int a, int b)
{
return a - b;
}
Когда вы используете эту библиотеку, sum
будет встроен и sub
будет нормальный нормальный звонок. Помните, вы можете даже определить sub
как inline
в заголовке библиотеки (без ее тела), и он все равно будет похож на обычный вызов функции.