我在用C语言写作。
在header1.h
中,我声明了一个指向常量字符串(char
的常量数组)的指针,一个带有struct和这种类型变量的新类型,以及另一个变量:
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也是const
struct entry_t { const char * text; const int var; };
也是const
const entry start_entry;
EDIT_2
我不关心 var ,我对const char *
成员感兴趣(即使可能问题是相同的:我之前写错了代码,也是{{1}我有一个错误......)。
我要重新定义所有:
int var
我无法理解为什么 start_entry 有一个//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
}
成员,我用const char*
定义它,但是有错误。
答案 0 :(得分:0)
问题在于,使用C编译器无法在全局范围内初始化此类语句,它被视为函数外部的代码: (就像你不能调用函数来获取tis返回值并初始化函数外的全局一样)
entry start_entry = {str_ptr, a};
str_ptr
在C中并不被视为常量,因为它被视为指针。 const
限定符在此处不执行任何操作。
(问题也发生在a
BTW上,看起来你正在使用一些奇怪的C ++编译器或一个特殊的C99选项,请参阅pmg评论)
简单地调用g++
时,您的示例就有效。
请注意您的“自然”陈述:
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;
另一点是:避免在头文件中声明全局变量,因为如果你有多个包含它的代码文件,你会得到多个包含或未定义的符号。
答案 1 :(得分:0)
您只能在初始值设定项中使用编译时常量。变量 str_ptr 甚至不是运行时常量。 <div class="myDiv">ASJKLJKLS
<div class="q">
<div class="w">
<div class="e">
<div class="r">
</div>
</div>
</div>
</div>
限定符的作用是防止 str_ptr 指向的字符串被修改。指针本身可以重新分配。因此,您需要在初始化函数中初始化您的开始条目:
const