【发布时间】:2016-12-30 01:45:31
【问题描述】:
我正在用 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 也是
const结构入口_t { 常量字符*文本; 常量 int 变量; };
-
在func.c中entry也是
constconst entry start_entry;
EDIT_2
我不在乎 var,我的兴趣在于const char * 成员(即使问题可能是一样的:我之前写错了代码,也有int var 我有一个错误...)。
我要重新定义所有:
//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* 定义它,但有那个错误。
【问题讨论】:
-
看起来您正在使用 C++ 编译器。在 C 中,显示的源代码中没有
entry_t本身的定义。 -
请提供一个最小、完整且可验证的示例:stackoverflow.com/help/mcve
-
我敢打赌您使用的是非 gcc 编译器,对吧?您能告诉我们您使用的是哪个编译器吗?
-
entry start_entry = {&str, a};是错误,&str是错误类型 -
您的代码中还有另一个潜在的错误;如果两个不同的 .c 文件包含
header.h,则a和str_ptr有多个定义。它们要么需要是static,要么只在标头中有extern声明。
标签: c string pointers struct constants