Могу ли я предоставить одно и то же определение функции в разных TU - PullRequest
1 голос
/ 11 июня 2019

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

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

Пока что я объявил функцию в заголовочном файле

void fct();

и предоставьте 2 определения в двух файлах, каждый из которых содержится в анонимном пространстве имен:

namespace
{
    void fct()
    {    
    }    
}

Но я не видел, как это может быть хорошим примером использования нескольких определений функции в разных TU.

Может ли кто-нибудь показать мне простой пример этого (даже с использованием inline) спасибо

1 Ответ

3 голосов
/ 11 июня 2019

Могу ли я предоставить одно и то же определение функции в разных TU

Если функция не объявлена ​​встроенной, то нет;это нарушило бы одно правило определения.

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

и предоставить 2 определения в двух файлах, каждый из которых содержится в анонимном пространстве имен:

Это не нарушает стандартные правила.Эти две функции не совпадают и не являются глобальными ::fct.

Но я не видел, как это может быть хорошим примером использования нескольких определений функции вразные TU.

Может кто-нибудь показать мне простой пример этого (даже с использованием встроенного) спасибо

Вот, пожалуйста:

// header.hpp
inline void foo() {}

// a.cpp
#include "header.hpp"

// b.cpp
#include "header.hpp"

Здесь естьдва TU, каждое из которых содержит определение для функции ::foo, включенных в один и тот же заголовок.Это разрешено, потому что функция объявлена ​​как встроенная.


Соответствующие стандартные кавычки (текущий черновик, несущественные детали отредактированы мной):

Правило единого определения [basic.def.odr]

A ... функция, ... не должна быть определена, когда предварительное определение обязательно достижимо ([module.reach]);Диагностика не требуется, если предыдущее объявление находится в другой единице перевода.

...

Каждая программа должна содержать ровно одно определение каждой не встроенной функции или переменной, которая используется в odr вэта программа за пределами отклоненного утверждения;Диагностика не требуется.... Определение встроенной функции или переменной должно быть доступно в каждой единице перевода, в которой она используется odr, за пределами отброшенного оператора.

...

Может быть большечем одно определение ... встроенной функции с внешней связью ([dcl.inline]) ... в программе при условии, что ни одно предварительное определение не обязательно достижимо ([module.reach]) в точке, где появляется определение, ипри условии, что определения удовлетворяют следующим требованиям.... никакая диагностика не требуется, если предварительное определение не достижимо в точке, где появляется более позднее определение.Если такой объект с именем D определен более чем в одной единице перевода, то

  • Каждое определение D должно состоять из одной и той же последовательности токенов;и
  • ~ длинный список других ограничений ~
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...