1

私は自分のファイルの1つでグローバル変数のペアを使用しており、それぞれ2つの異なるファイル(1つのファイル、2つの方法で前処理)の1つの宣言.cに一致しています。1つは公的消費用で、もう1つは私的使用用です。どちらも変数です。extern.h.hconst

.cファイル内の変数の1つだけを初期化し、2番目の変数を同じコンテンツに割り当てたいだけです。.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含まれている場合、インクルードファイルが変数にアクセスできるようにすることです。'dは私のファイルの定義にアクセスします。ただし、その定義なしで含まれている場合は、代わりに'dにアクセスできます(これは内部ファイルで使用する予定であり、必要に応じて利用できるようにします)。EXTERNALIZEPaws__Listextern.cexternList#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、ファイル内の同じ構造体に2つの名前を定義して、どちらか一方をヘッダー.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 に答える