Элемент Initializer не является константой для глобального объявления функции времени

У меня есть программа C с функцией времени, объявленной глобально следующим образом:

time_t t = time(NULL);
struct tm *tm = localtime(&t);
time(&rawtime);
void file_name()
{
   sprintf(buffer,"data/log_%d.%d_%d:%d:%d",tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec);
   char *p = buffer;
   for(;*p;++p)
  {
     if(*p == ' ')
     *p = '_';
  }
  printf("%s",buffer);
  }
}

void create_file()
{
  file_name();
  fptr = fopen(buffer,"w"); 
}

void read_data();
{
.
.
.
.

sprintf(buffer1,"_%d:%d:%d",tm->tm_hour,tm->tm_min,tm_sec);
fprintf(fptr,"%d.%d_%d:%d:%d,%d",tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec);
close_file();

}


int main()
    {



       read_data();

       .
       .


       return 0;
    }

Поскольку я хочу использовать tm еще в двух функциях, например, одна из них — filename(); и аналогично другая функция, называемая read_data(); в программе для печати месяца, даты и т. д. Я хочу объявить их глобально. Но когда я компилирую программу, она выдает ошибку, называемую элементом инициализатора, не константа в time_t t = time(NULL); и struct tm *tm = localtime(&t); Может ли кто-нибудь помочь мне в этом заранее спасибо.


person sp5    schedule 09.04.2018    source источник
comment
Предоставьте минимально воспроизводимый пример. Это недопустимая программа на C.   -  person too honest for this site    schedule 09.04.2018
comment
Все еще не mcve и все еще не действительный C. Пожалуйста, проверьте основы языка в своем учебнике для начинающих. Также прочитайте Как задать вопрос и укажите, почему вы считаете, что вам нужно сделать это именно так.   -  person too honest for this site    schedule 09.04.2018
comment
Стандарт C гласит: Все выражения в инициализаторе для объекта, который имеет статическое или потоковое хранение, должны быть константными выражениями или строковыми литералами. Вы пытаетесь инициализировать вызовы функций, что не является одним из двух опции. Так нельзя.   -  person Bo Persson    schedule 09.04.2018
comment
Могу ли я узнать, как я могу инициализировать их в основной функции?   -  person sp5    schedule 09.04.2018


Ответы (1)


Следующий код:

time_t t = time(NULL);
struct tm *tm = localtime(&t);

не действует. Вы не можете вызвать функцию при инициализации глобальной переменной в C. Элемент инициализатора (например, в time(NULL) для t) не является константой (компилятор не знает его значение при компиляции, например, для time(NULL) компилятор не знает, который час когда программа запускается, когда компилятор компилирует программу).
Также вы не можете вызывать do глобальный вызов функции, вы должны быть в какой-то функции, чтобы вызвать что-либо, код:

 time(&rawtime);

также недействителен.

Вы можете объявить эти переменные как глобальные переменные и инициализировать их в main(). Все глобальные переменные, которые не имеют никакой инициализации, инициализируются 0 или NULL. Пример:

time_t t;
struct tm *tm;
...
int main() { 
   // first things first - initialize global variables to a known state
   t = time(NULL;
   tm = localtime(&t);
   time(&rawtime);
   // other things to do
   ...
   read_data();
   ...
}
person KamilCuk    schedule 09.04.2018