Использование переменных stati c в качестве переключателя регистрации в C ++ - PullRequest
0 голосов
/ 29 февраля 2020

Там есть main.cpp, в котором много Log напечатано везде:

#include "utils.hpp"
...//some code  
int main(){
 int a = 0;
 int b = 0;
 util::LogClass::Log("Initial","something);  

 //some more code 
 util::LogClass::Log("Mid","something");  

 //some more code  
 util::LogClass::Log("Middle","something");  
}

И LogClass определяется следующим образом: utils.hpp:

namespace util{
 class LogClass{
     public:static bool LOG_ENABLED;
     public: static void Log(std::string tag, std::string message){
      if(LOG_ENABLED){
      std::cerr << tag+": "+message <<std::endl;}
    }
  }
  bool LogClass::LOG_ENABLED=true;
}

Я был думая, что я смогу сделать это в main.cpp:

#include "utils.cpp"  
util::LogClass::LOG_ENABLE=false;
int main(){ //the previous main function}  

*, приведенный выше код фактически выдает ошибку: переопределение 'bool util :: LogClass :: LOG_ENABLED' bool util: : LogClass :: LOG_ENABLE = false *

, но если я переместу его внутрь основного:

#include "utils.cpp"  

int main(){ util::LogClass::LOG_ENABLED=false; //the previous main function}    

, тогда код компилируется нормально. Поэтому у меня возникает вопрос: почему я не могу включить его вне функции main(), даже если он является элементом stati c, и почему компилятор (g++) принимает его как переопределение?

1 Ответ

1 голос
/ 29 февраля 2020

Вы можете статически инициализировать переменную только в той точке, где она определена. Инициализация внутри основной функции - Dynami c, так что все в порядке.

Я согласен, что ошибка компилятора странная, хотя - возможно, компилятор пытается автоматически вывести «отсутствующий» тип, который должен быть там для переопределения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...