Согласно одному правилу определения (ODR), у меня не может быть функции
void function()
{
}
, определенной более одного раза в одном исполняемом файле - линкер будет возражать.Однако ODR игнорируется для встроенных функций:
inline void function()
{
}
может быть определено в заголовочном файле, который будет #inclined в нескольких файлах .cpp, и поэтому, когда получающиеся файлы .obj связаны вместе, компоновщик видит, что 'несколько экземпляров этой функции и намеренно игнорирует это.Он предполагает, что это та же самая функция и просто использует один из экземпляров.Поскольку поведение программы сохраняется, никого не волнует.
Но если по какой-либо причине использование препроцессора включало , эти экземпляры имеют разные реализации, компоновщик снова выберет одну из функций иразработчик даже не узнает, какая из них выбрана, пока он полностью не протестирует свою программу.
Как обстоят дела с последней ситуацией, когда компоновщик выбирает одну из функций, и у них, как оказалось, классифицируются разные реализации?Это неопределенное поведение или любая другая ситуация?