Предположим, что у меня есть два файла .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