встроенная функция и класс и файл заголовка

  1. Будет ли какая-либо функция, определенная в заголовочном файле, автоматически встроена?
  2. Если я объявлю функцию в классе и дам определение снаружи, используя ключевое слово inline, будет ли эта функция встроенной? Если это так, то почему это не противоречит закону, согласно которому встроенная функция должна быть указана при объявлении?

3

Решение

Любая функция, определенная внутри определения класса, является встроенной. Любая функция помечена inline также встроенный.

class C {
int f() { return 3; } // inline
int g();
int h();
}inline int C::g() { return 4; } // inline
int C::h() { return 5; } // not inline

Если весь этот код находится в заголовке и этот заголовок используется более чем в одном модуле перевода, вы получите жалобу на C::h имеет более одного определения. C::f а также C::g все в порядке, потому что они встроены. Это основная роль inline в эти дни: разрешить определение одной и той же функции в нескольких местах (при условии, что определения «одинаковы»).

7

Другие решения

это то, что любая функция, определенная в заголовочном файле, автоматически будет встроенной?

Нет, вы должны сделать любую функцию, определенную вне тела класса, встроенной руками. В противном случае, скорее всего, вы получите ODR нарушение (если включить заголовок в несколько единиц перевода).

ISO C ++ 11

3.2 Одно правило определения

1: ни одна единица перевода не должна содержать более одного определения любой переменной, функции, типа класса, типа перечисления или шаблона.

[…]

4: Каждая программа должна содержать ровно одно определение каждой не встроенной функции или переменная, которая используется odr в этой программе; Диагностика не требуется. Определение может явным образом появиться в программе, оно может быть найдено в стандартной или пользовательской библиотеке или (при необходимости) неявно определено (см. 12.1, 12.4 и 12.8). Встроенная функция должна быть определена в каждой единице перевода, в которой она используется odr.


если я объявлю функцию в классе и дам определение вне, используя ключевое слово inline, будет ли эта функция встроенной? Если это так, то почему это не противоречит закону, согласно которому встроенная функция должна быть указана при объявлении?

Есть несколько способов сделать функцию-член встроенной:

Во-первых, согласно 7.1.2 / 3:

Функция, определенная в определении класса, является встроенной функцией. Встроенный спецификатор не должен появляться в объявлении функции контекста блока. 90 Если встроенный спецификатор используется в объявлении друга, это объявление должно быть определением, или функция должна быть ранее объявлена ​​встроенной.

struct First
{
void first(){}
};

Второе, третье и четвертое, согласно 9.3 / 3:

в соответствии функция-член (статическая или нестатическая) также может быть определена вне определения класса при условии, что либо объявление в определении класса, либо определение вне определения класса объявляет функцию как встроенную. [Примечание: функции-члены класса в области пространства имен имеют внешнюю связь. Функции-члены локального класса (9.8) не имеют связи. Смотрите 3.5. —Конечная записка]

struct STF
{
void second();
inline void third();
inline void fourth();
};

inline void STF::second(){}
void STF::third(){}
inline void STF::fourth(){}
4

inline это «подсказка», поскольку компилятор не должен соблюдать его. Это может сделать вещи встроенными, если вы не помечаете их как встроенные, и вам не нужно включать то, что вы помечаете как встроенные.

Я имею в виду, что вы не должны полагаться на это. Многие рекомендуют даже не использовать его, поскольку это вводит в заблуждение. Большинство современных компиляторов полностью игнорируют это.

Единственное практическое использование — позволить вам помещать статические реализации в заголовок. Независимо от того или нет, что это хорошая вещь, чтобы сделать, это спорно.

1
По вопросам рекламы [email protected]