1

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

我只想初始化.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(我打算在我的内部文件中使用它,并在用户需要时提供#include)。

但是,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;
                                       ^~~~

我正在寻找任何可以帮助我完成上述工作的帮助(也就是说,const在我的文件中为同一个结构定义两个名称,以便标题.c可以引用一个或另一个。).h

4

1 回答 1

0

如果我理解正确,您想定义一个接口(vtable),并且实现会因EXTERNALIZE而异:

我会走那条路:


/* 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 文件中。

于 2010-02-05T09:53:50.097 回答