1

我尝试在我的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调用文件buttons.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);
}

我看到了很多关于静态的类似问题,但是

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

不工作。如何将此变量定义为全局变量?避免类似功能的重复

4

1 回答 1

1

来自 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 声明为具有外部链接,而第二个声明将变量声明为具有内部链接。

于 2020-03-18T19:44:23.427 回答