У меня есть следующее:
//a.cpp
inline int f(int x) { return x; }
int g(int x) { return f(x); }
//b.cpp
#include <iostream>
inline int f(int x) { return x + 1; }
extern int g(int);
int main() {
std::cout << g(2) << f(2) << std::endl;
}
На выходе получается 22
(MSVC и GCC), то есть вместо a.cpp
встроена f
b.cpp
функция. По каким критериям выбирать функцию f
в этом случае?
да. Вот так!
Это кажется актуальным: Одно правило определения
Вы включили оптимизацию? Я подозреваю, что вы можете получить другой ответ для сборки без оптимизации/отладки (без встраивания) и для оптимизированной/релизной сборки (с встраиванием).
Вы нарушаете ODR (Оne Дefinition рule) здесь и имеете плохо сформированную программу, диагностика не требуется.
Каждое встроенное определение должно быть идентичным.
Возможно, расширение того, что означает ODR, поможет завершить этот ответ.
Ваш код неправильно сформирован, диагностика не требуется. Все определения встроенных функций должны быть одинаковыми во всех единицах перевода.
Поскольку вы этого не делаете, код имеет неправильный формат, но его можно компилировать, и не требуется вызывать какие-либо предупреждения или ошибки.
Может быть, дать ссылку на en.cppreference.com/w/cpp/язык/определение для получения дополнительной информации или объяснить ODR более подробно?
@joãopauli нет, это UB. См. элемент списка 1 здесь: en.cppreference.com/w/cpp/language/inline
@jo - Нет. Должно быть точно такое же определение.
О, классно! Понятно!
Вы имеете в виду, что вы скомпилировали и связали как a.cpp, так и b.cpp?