Объявить и определить статическую переменную в заголовке С++?

questions рассмотрите, как распределить переменную, объявив ее в файле заголовка и определяя ее (выделяя) в файле .cpp.

Что я хочу сделать, это не использовать какие-либо файлы .cpp для моего класса и определять все функции как inline (в файле заголовка). Проблема, с которой я сталкиваюсь, состоит в том, как определить статические переменные-члены, так что даже если файл .h включен в несколько компиляционных единиц, я не получаю ошибку "первый определенный здесь".

Я открыт для препроцессорных хаков и т.д., если он выполняет задание. Я просто хочу избежать любых .cpp файлов.

Если это важно, я использую GCC.

Ответ 1

Вы можете злоупотреблять шаблоном singleton, если вам действительно нужно избегать любых файлов .cpp:

class Foo {
    public:
        static Bar& getMyStatic() {
            static Bar bar;
            return bar;
        };
};

Это работает, потому что теперь переменная является статической переменной внутри функции, а static имеет другое значение в контексте функции, чем в контексте класса. А для функций компоновщик распознает несколько идентичных определений и выбрасывает копии.

Но, конечно, я настоятельно рекомендую избегать файлов .cpp: это означает, что вы попадаете в ситуацию, когда вам нужно собрать всю программу или, по крайней мере, ее большие части, в одной большой части. Каждое изменение, которое вы сделаете, потребует полной перестройки, которая значительно замедлит ваш цикл замены-компиляции. Для очень маленьких проектов, которые могут не быть проблемой, но для средних и крупных.

Ответ 2

С помощью статических переменных вы должны вставить файл .cpp, чтобы избежать возможности множества статических переменных, когда намерение состоит в том, чтобы иметь только один. Кроме того, неплохо иметь большие встроенные методы, так как это всего лишь намек на компилятор, но также делает компиляцию более продолжительной (вы меняете некоторые из этих функций в процессе разработки, а затем нужно скомпилировать множество зависимых файлов!)

Однако, если вам не нужно много файлов .cpp с несколькими статистическими данными, почему бы не сохранить только один файл.

Ответ 3

Пока вы включаете только этот заголовочный файл один раз во весь проект, вы будете в порядке. Однако это довольно сильное требование, и может быть трудно заставить других придерживаться.

У вас может быть переменная static, но это означает, что у вас более одной для всей программы, что может быть или не иметь значения (помните, что вы не можете изменить ее в будущем, так что у вас может быть что называется "скрытой ошибкой" - вы меняете какой-то другой код, и вдруг вы создали новую ошибку, потому что переменная не является ОДНОЙ переменной).