Могу ли я предоставить одно и то же определение функции в разных 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 должно состоять из одной и той же последовательности токенов;и
- ~ длинный список других ограничений ~