Встраивание методов класса в статическую библиотеку - PullRequest
0 голосов
/ 02 ноября 2018

В этом вопросе ответ гласит, что для встраивания функции для статической библиотеки функция объявляется 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 Ответ

0 голосов
/ 02 ноября 2018

В C ++ вы можете объявить функцию как inline, только если код функции доступен во время компиляции (если вы действительно хотите встроить этот код функции). Таким образом, вы не можете реализовать тело функции внутри скомпилированной статической библиотеки, которая не будет доступна при использовании этой статической библиотеки. Если вы сделаете это, этот вызов функции будет похож на обычный вызов функции.

От cppreference :

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 в заголовке библиотеки (без его тела), и он все равно будет похож на обычный вызов функции.

...