У меня есть этот код:
Код: Выделить всё
#ifndef BT_ORDER_HPP
#define BT_ORDER_HPP
class Order {
public:
/*....*/
private:
static unsigned long long id_generator;
const unsigned long long id;
};
unsigned long long Order::id_generator = 0;
#endif//BT_ORDER_HPP
он не компилируется, если заголовочный файл включен в несколько единиц компиляции, потому что, насколько я понял, статическая переменная определена во всех единицах компиляции. Но для меня это не имеет смысла, потому что я использую охранники ifndef; Я думал, что компилятор проверит, определен ли уже макрос, и в этом случае опустит код, защищенный блоком, включая определение статической переменной. Этот конкретный класс, который я создаю, имеет множество встроенных простых функций, поэтому создание исходного файла .cpp для него решит проблему, и это стандартный способ сделать это, но в данном случае я чувствую, что в этом нет необходимости, поскольку Мне пришлось бы создать совершенно новый файл всего с двумя строками кода:
Код: Выделить всё
#include "order.hpp"
unsigned long long Order::id_generator = 0;
Может ли кто-нибудь объяснить, что здесь происходит, и предложить элегантное решение?
Подробнее здесь:
https://stackoverflow.com/questions/758 ... -work-in-c