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

Согласно одному правилу определения (ODR), у меня не может быть функции

void function()
{
}

, определенной более одного раза в одном исполняемом файле - линкер будет возражать.Однако ODR игнорируется для встроенных функций:

inline void function()
{
}

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

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

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

1 Ответ

6 голосов
/ 10 ноября 2010

Да, это 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

...