Как обстоят дела, когда различные реализации встроенной функции связаны в один исполняемый файл?
Согласно одному правилу определения (ODR), я не могу иметь функцию
void function()
{
}
определяется более одного раза в одном исполняемом файле - компоновщик возражает. Однако ODR игнорируется для встроенных функций:
inline void function()
{
}
может быть определен в заголовочном файле, который будет #include во множественные файлы.cpp, и поэтому, когда получающиеся файлы.obj связаны вместе, компоновщик видит, что есть несколько экземпляров этой функции, и намеренно игнорирует это. Предполагается, что это та же самая функция, и просто используется один из экземпляров. Так как поведение программы сохраняется, никому нет дела.
Но если, по какой-либо причине, включая использование препроцессора, эти экземпляры имеют разные реализации, компоновщик снова выберет одну из функций, и разработчик даже не узнает, какая из них выбрана, пока он полностью не протестирует свою программу.
Как обстоят дела в последней ситуации, когда компоновщик выбирает одну из функций, и у них, как оказалось, классифицируются разные реализации? Это неопределенное поведение или любая другая ситуация?
1 ответ
Да, это UB для встроенных функций с внешним связыванием (я думаю, что это и есть намерение ОП).
$ 3,2/5-
Может быть более одного определения типа класса (раздел 9), типа перечисления (7.2), встроенной функции с внешней связью (7.1.2), шаблона класса (раздел 14), шаблона нестатической функции (14.5.5) статический член данных шаблона класса (14.5.1.3), функция-член шаблона класса (14.5.1.1) или специализация шаблона, для которого некоторые параметры шаблона не указаны (14.7, 14.5.4) в программе при условии, что каждый определение появляется в другой единице перевода, и при условии, что определения удовлетворяют следующим требованиям.
Если такой объект с именем D определен более чем в одной единице перевода, то
- каждое определение D должно состоять из одинаковой последовательности токенов; а также
В том же пункте в конце говорится, что несоблюдение этих требований ведет к UB