如何在C模块中将两个全局'const'变量定义为相同的值?

如何在C模块中将两个全局'const'变量定义为相同的值?,c,constants,global-variables,extern,C,Constants,Global Variables,Extern,我在一个.c文件中使用了一对全局变量,与两个不同的.h文件(一个.h文件,预处理两种方式)中的单个外部声明相匹配。一个供公众消费,一个供私人使用。两者都是常量变量 我只想初始化.c文件中的一个变量,然后将第二个变量分配给相同的内容。以下是目前.c文件的相关内容: struct List_methods const List = { .create = List__create, .create_naughty = List__create_naughty, // …

我在一个
.c
文件中使用了一对全局变量,与两个不同的
.h
文件(一个
.h
文件,预处理两种方式)中的单个
外部声明相匹配。一个供公众消费,一个供私人使用。两者都是常量变量


我只想初始化
.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\u列表
变量的访问权,
extern
'd访问my
.c
文件中的定义。但是,如果没有该定义就包含它,则它们可以访问
外部
'd
列表
(我打算在我的内部文件中使用它,如果
\include
er需要它,就可以使用它)

但是,
Paws\uuu 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
文件中为同一结构定义两个
常量
名称,以便
.h
标题可以引用其中一个名称)。

如果我理解正确,您希望定义一个接口(vtable)实施方式将根据外部化的不同而有所不同:

我会走那条路线:


/* header file */
/* define the interface */
typedef struct List_methods {
  list  (*create)         (void);
  list  (*create_naughty) (void);
  // …
} List_Methods;

const extern List_methods Paws_List; // note: double underscores are afaik not allowed
const extern List_methods Other_List; // take any name but List

#ifdef EXTERNALIZE
# define  List          Paws_List
#else
# define  List          Other_List
#end
重要的是,这些结构是同一类型的,否则不能将一个指定给
其他的。其次,我不会用别名覆盖符号。这只会在您希望在.c文件中同时使用这两个文件时出现问题。

Paws\u列表是列表的副本吗?不是引用或某种别名?它的目的是引用相同的东西。不过,它不应该是指针。i、 e.使用
extern Paws\uu List
的代码应该得到与使用
extern List
的代码相同的东西,只要两者都是针对这个
.c
文件编译的。是否存在两者不应该相同的情况?“我只想初始化.c文件中的一个变量,然后将第二个变量分配给相同的内容”. 如果有帮助的话,编译器中发生的事情是初始化,而不是赋值。我想我不太明白这个问题,是什么阻止了你在使用Paws版本和类型名称的任何地方都只做
\define Paws\uu List(List)
?为什么要使用保留名称?;-)@ELIOTTROLL,双下划线是留给编译器的,例如C++编译器可能使用它们来命名MangLangNo,这是向后的:我只想暴露一个接口,但是它是一个不同的接口,这取决于<代码> ExulalIt//C>。具体地说,大多数针对我的库进行构建的人将包括
Paws.h
,它设置
外部化
,然后包括我库中的其他头。该文件设置了一个包含这些其他结构的结构,如
Paws.List….
。这意味着
列表
本身在该名称下不可用;相反,它是作为
Paws\uu List
提供的,然后存储在
Paws
结构下。但是,在我的库中(或者,如果人们不通过全局
Paws.h
直接(单独)包含我的标题),当
.c
文件单独编译时,
List
是自己定义的,我的其他名称空间也是如此;这与上面的相反。这允许我维护两个API:一个内部API,由一组
常量
变量(
列表
数值
字符串
,等等)组成;另一个外部API,所有内容都安全地存储在
Paws
下(以避免人们在构建时发生冲突),所有这些都解释了……问题中描述的
List.h
文件需要
extern
a
List
定义(包含在内部文件中时),或者
extern
a
Paws\u List
定义(当包含在
Paws.h
中时,它设置
EXTERNALIZE
…然后将
Paws\u列表
和朋友存储在
extern
'd
Paws
变量中)。