我在用c写。
在header1.h
中,我声明了一个指向常量字符串(char
的常量数组)的指针,一个具有该类型的结构体和变量的新类型,以及另一个变量:
const char *str_ptr = "Hello world!";
struct entry_t {
const char *text;
int var;
};
typedef entry_t entry;
extern entry start_entry;
int a;
在文件func.c
中,我定义了新的变量:
#include "header1.h"
entry start_entry = {str_ptr, a};
void func(void)
{
//here i use start_entry
}
但是编译器告诉我错误
需要常量表达式
表示start_entry
的初始化,特别是const char*
成员的初始化。为什么?错误在哪里?
当然,如果我将字符串定义为
const char str[] = "Hello world!";
,然后entry
变量为
entry start_entry = {&str, a};
一切正常
EDIT_1
我在报告代码时犯了两个错误:var is
const
toostruct entry_t {Const char *text;int变量;};
in function .c entry is
const
too
EDIT_2
我不关心var,我的兴趣是在const char *
成员(即使问题是相同的:我之前写了错误的代码,也有int var
我有一个错误…)。我要重新定义all:
//header1.h
const char *str_ptr = "Hello world!";
struct entry_t {
const char *text;
};
typedef entry_t entry;
extern const entry start_entry;
//func.c
#include header1.h
const entry start_entry = {str_ptr};
void func(void)
{
//here i use start_entry
}
我不明白为什么start_entry有一个const char*
成员,我用const char*
定义它,但有这个错误。
只能在初始化器中使用编译时常量。变量str_ptr甚至不是一个运行时常数。const
限定符的作用是防止str_ptr所指向的字符串被修改。指针本身可以重新赋值。因此,您需要在初始化函数中初始化您的开始项:
#include "header1.h"
entry start_entry;
void func(void)
{
//here i use start_entry
}
void init(void)
{
start_entry.text = str_ptr;
start_entry.var = a;
}
问题是,在C编译器中,你不能在全局范围内初始化这样的语句,它被认为是函数之外的代码:(同样的,你不能调用一个函数来获取返回值并在函数外部初始化一个全局变量)
entry start_entry = {str_ptr, a};
str_ptr
在C语言中并不被认为是常量,因为它被看作是一个指针。const
限定符在这里没有任何作用。
(这个问题也发生在我与a
BTW,看起来你正在使用一些奇怪的c++编译器或一个特殊的C99选项见pmg评论)
当简单地调用g++
时,您的示例工作。
关于"natural "语句的说明:
entry start_entry = {&str, a};
编译(与你的编译器,gcc仍然拒绝它,因为a
),但由于你传递的地址指针,而不是指针本身=>未指定的行为:不好。
如果你想这样做,我建议你使用c++编译器。
如何使用简单的gcc调用:
char str_ptr[] = "Hello world!";
entry start_entry = {str_ptr, 12}; // considered as an array, value decided by the compiler, even if const keyword is missing
什么不
const char *str_ptr = "Hello world!";
entry start_entry = {str_ptr, 12}; // str_ptr is considered as a variable pointer even if const
entry start_entry = {"Hello world!", a}; // a is a variable: nocantdo
你是对的是,char []
告诉编译器指针是常量,即使没有const
关键字BTW,而const
关键字不考虑在内。
指出:
我必须修复你的代码,所以它可以用我的gcc编译器编译:
typedef struct {
const char *text;
int var;
} entry;
extern entry start_entry;
另一点是:避免在头文件中声明全局变量,因为如果你有多个包含它的代码文件,你会得到多个包含或未定义的符号。