У меня есть заголовок util.hpp
, содержащий простую структуру:
// util.hpp
struct Point {
float x;
float y;
};
Два файла cpp, давайте назовем их a.cpp
и b.cpp
, оба включают util.hpp
:
// a.cpp
#include "util.hpp"
void funcA(float _x, float _y) {
Point p;
p.x = _x;
p.y = _y;
// ...
}
// b.cpp
#include "util.hpp"
void funcB(float _x, float _y) {
Point p;
p.x = _x;
p.y = _y;
// ...
}
int main() {
// ...
}
Когда я компилирую a.cpp
и b.cpp
по отдельности, а затем связываю их вместе, я не получаю ошибок.
Почему это так?Поскольку я включаю util.hpp
в оба файла, разве у нас не будет двойного определения struct Point
?Например, когда я добавляю определение переменной в util.hpp
следующим образом:
// util.hpp
struct Point {
float x;
float y;
};
// New variable
int foo;
, я получаю следующую ошибку при линковке:
g++ a.o b.o -o test -O0
b.o:(.bss+0x0): multiple definition of `foo'
a.o:(.bss+0x0): first defined here
, что имеет смысл для меня, но почему нетне происходит ли та же ошибка для структуры?