Исключение из правила "только одна реализация"? - PullRequest
10 голосов
/ 17 июня 2010

Пока я читал принятый ответ на этот вопрос , у меня был следующий вопрос:

Как правило, методы определяются в заголовочных файлах (.hpp или что-то еще), а реализация в исходных файлах (.cpp или что-то еще).

Одна из основных причин, по которой когда-либо включать «исходный файл» (#include <source_file.cpp>) является плохой практикой, заключается в том, что реализация его методов будет дублирована, что приведет к ошибкам компоновки.

Когда пишут:

#ifndef BRITNEYSPEARS_HPP
#define BRITNEYSPEARS_HPP

class BritneySpears
{
  public:

    BritneySpears() {}; // Here the constructor has implementation.
};

#endif /* BRITNEYSPEARS_HPP */

Он дает реализацию конструктора (здесь "пустую" реализацию, но все же).

Но почему при многократном включении этого заголовочного файла (иначе говоря, в разных исходных файлах) не генерирует ошибку «дублированного определения» во время соединения?

Ответы [ 3 ]

13 голосов
/ 17 июня 2010

Встроенные функции - исключения из «одного правила определения»: вам разрешено иметь их идентичные реализации в более чем одном модуле компиляции.Функции являются встроенными, если они объявлены inline или реализованы внутри определения класса.

7 голосов
/ 17 июня 2010

Функции-члены с реализацией внутри определения класса рассматриваются как встроенные функции. Встроенные функции освобождены от одного правила определения.

В частности, когда компоновщик видит две встроенные функции с одинаковой сигнатурой, он обрабатывает их, как если бы это была одна и та же функция, и просто выбирает одну из них. Это может привести к действительно странным, трудно обнаруживаемым проблемам .

2 голосов
/ 17 июня 2010

Потому что это «встроенная» функция. Встроенные функции могут включаться из заголовков столько раз, сколько вам нужно, и они не вызывают повторяющихся ошибок компоновщика определений.

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

...