Предположим, что у меня есть два файла .cpp file1.cpp и file2.cpp:
// file1.cpp
#include <iostream>
inline void foo()
{
std::cout << "f1\n";
}
void f1()
{
foo();
}
и
// file2.cpp
#include <iostream>
inline void foo()
{
std::cout << "f2\n";
}
void f2()
{
foo();
}
И в main.cpp я указал вперед f1() и f2():
void f1();
void f2();
int main()
{
f1();
f2();
}
Результат (не зависит от сборки, тот же результат для сборки отладки/выпуска):
f1
f1
Whoa: Компилятор каким-то образом выбирает только определение из file1.cpp и использует его также в f2(). Каково точное объяснение этого поведения?
Обратите внимание, что изменение inline до static является решением этой проблемы. Ввод встроенного определения внутри неназванного пространства имен также решает проблему, и программа печатает:
f1
f2