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

Согласно одному правилу определения (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

Другие вопросы по тегам