Рассмотрим следующий пример:
// file header1.h
#include <iostream>
void foo()
{
std::cout << "Foo" << '\n';
}
// file source1.cpp
#include "header1.h"
// file main.cpp
#include "header1.h"
int main()
{
return 0;
}
В связи с тем, что определение foo находится в хедере (что не очень хорошо), который включён в более чем один .cpp файл, линкер честно выдает ошибку наподобие:
multiple definition of foo ... first defined in main.o ...
Одно из решений - сделать foo статической функцией, что обеспечит одно определение в объектных файлах:
static foo() { ... }
второе:
inline foo() { ... }
третье:
static inline foo() { ... }
Вопросы:
Почему
inlineфункция тоже решает эту проблему?Какие принципиальные отличия у этих решений?