В качестве примера.Эта версия недействительна.
// main.cpp
inline int square(int num) {
return num * num;
}
inline int square(int num) {
return num * num;
}
int main()
{
return square(2);
}
https://godbolt.org/z/nlSbxg
Но если она у вас есть в нескольких .cpp
файлах (или переводных единицах), это нормально, потому что теперь это компоновщикработа, чтобы делать правильные вещи.
// b.cpp
inline int square(int num) {
return num * num;
}
// main.cpp
inline int square(int num) {
return num * num;
}
int main()
{
return square(2);
}
Сборка: gcc main.cpp b.cpp
Точно так же работает #include
он поместит код в эти .cpp
файлы, и все.
Конечно, если телофункция встроенная , тогда ничего связывать, так что нет проблем:)
Если компилятор решит сделать версию вне линии, вы получите более одного объектного файла (.o
) имея определение для той же самой "встроенной" функции.Такое определение будет помечено.
Благодаря тому, что компоновщик метки не даст того, что он нашел несколько определений, он просто выберет первое найденное определение.
Так что, если все определения действительно одинаковытогда хорошо!Мы попадем в неприятности, если у нас будет другое тело такой функции.Пример в файле b.cpp
// b.cpp
inline int square(int num) {
return 1;
}
Неопределенное поведение - иметь несколько разных определений одной и той же встроенной функции.Это скомпилируется конечно, но что мы получим?Это зависит от выбора компоновщика: D