【发布时间】:2010-02-05 07:14:49
【问题描述】:
我在我的一个.c 文件中使用了一对全局变量,它们与两个不同的.h 文件中的一个extern 声明相匹配(好吧,一个.h 文件,以两种方式预处理) .一种是公用的,一种是私人使用的。两者都是const 变量。
我只想初始化我.c文件中的一个变量,然后将第二个变量赋值给相同的内容。以下是目前.c文件的相关内容:
struct List_methods const List = {
.create = List__create,
.create_naughty = List__create_naughty,
// …
};
struct List_methods const Paws__List = List;
... 以及对应的 .h:
#if defined(EXTERNALIZE)
# define List_methods Paws__List_methods
# define List Paws__List
#endif
// …
struct List_methods {
list (*create) (void);
list (*create_naughty) (void);
// …
} const extern List;
#if defined(EXTERNALIZE)
# undef List_methods Paws__List_methods
# undef List Paws__List
#endif
这里的目标是确保当.h 包含在定义的EXTERNALIZE 中时,包含文件可以访问Paws__List 变量,extern'd 可以访问我的.c 文件中的定义.但是,如果包含没有该定义,则他们可以访问extern'd List(我打算在我的内部文件中使用它,如果#includeer想要)。
但是,Paws__List = List 分配在我的编译器中爆炸,出现以下错误:
Source/Paws.o/list/list.c:32:40: error: initializer element is not a
compile-time constant
struct List_methods const Paws__List = List;
^~~~
我正在寻求任何帮助以使这项工作如上所述(也就是说,在我的 .c 文件中为同一结构定义两个 const 名称,这样一个或另一个可以是由.h 标头引用。)
【问题讨论】:
-
Paws__List 旨在成为 List 的 副本?不是参考或某种别名?
-
它旨在引用相同的东西。不过,它不应该是一个指针。即使用
extern Paws__List的代码应该得到与使用extern List的代码相同的东西,只要两者都针对这个.c文件进行编译。 -
是否存在两者不应该相同的情况?
-
“我只想初始化我的.c文件中的一个变量,然后将第二个变量赋值给相同的内容”。如果它有帮助,编译器中发生的事情是初始化,而不是赋值。我认为我不太了解这个问题,是什么阻止您在使用 Paws 版本的任何地方都执行
#define Paws__List (List),并且类型名称也是如此?为什么要使用保留名称? ;-) -
@elliottcable,双下划线是为编译器保留的,例如 C++ 编译器可能会使用它们进行名称修改
标签: c constants global-variables extern