C - проблема с const - ошибка: элемент инициализатора не является константой - PullRequest
1 голос
/ 18 марта 2020

Я пытаюсь добавить глобальную переменную в мой файл buttons.c, но у меня ошибка - initializer element is not constant. Пример headers.h файл

struct MainStruct {
  GtkEntryBuffer *buffer;
  GtkWidget *entry;
  GtkWidget *label;
};

extern struct MainStruct *p;
extern const char *text_entry;
void lower_button_clicked(GtkWidget *lowerbutton);

и когда файл main. c вызывает файл кнопки. c, я не могу определить переменную text_entry , Что я делаю не так?

кнопки. c

#include <gtk/gtk.h>
#include "headers.h"

const char *text_entry = gtk_entry_buffer_get_text(p -> buffer); // is not constant, why?
void lower_button_clicked(GtkWidget *lowerbutton)
{
  printf("%s\n", text_entry);
}

Я видел много похожих вопросов, которые говорят о stati c, но

static const char *text_entry = gtk_entry_buffer_get_text(p -> buffer);

не работает. Как определить эту переменную как глобальную? чтобы избежать дублирования в похожих функциях

1 Ответ

1 голос
/ 18 марта 2020

Из C стандарта (6.7.9 инициализация)

4 Все выражения в инициализаторе для объекта, который имеет статическую или потоковую длительность хранения, должны быть константными выражениями или строковыми литералами.

И в этом объявлении

const char *text_entry = gtk_entry_buffer_get_text(p -> buffer);

инициализатор не является константным выражением. Таким образом, компилятор выдает ошибку.

Также обратите внимание на то, что эти объявления

extern const char *text_entry;

и следующие за ним

static const char *text_entry = /*...*/;

противоречат друг другу. Первое объявление объявляет переменную text_entry как имеющую внешнюю связь, тогда как второе объявление объявляет переменную как имеющую внутреннюю связь.

...