3

私はいくつかの古いコードをリファクタリングして持ち込もうとしていますが、次のようなものに出くわしました:

          struct foo;
typedef   struct foo *    foo;

コンパイルしようとすると、次のようなエラーが発生します。

Source/Types/Types.h:27:18: error: redefinition of 'foo' as different kind of symbol
typedef   struct foo *    foo;
                 ^

誰がこれを引き起こしているのか知っていますか? 私は長い間コードに触れていませんでしたが、それに関連するエラーは確かに覚えていません。これはコードベースの中で最もコアなコードの一部であり、すべてがそれに依存しています。本当にエラーである場合、そのような明白なエラーを見逃した可能性があるとは思いません。オリジナルfooは「struct タグ」 (structキーワードの後の適切な参照のみ) であるため、どのようにして新しいfootypedef された型と競合するのでしょうか?

編集 1:これが実際のファイル全体です。何か不足している可能性がありますが、かなり単純なようです。上記と同じエラーを、タイプごとに 1 つずつダンプします。

# if !defined(TYPE_DECLARATIONS)
#   define    TYPE_DECLARATIONS

# include "Core.h"
# warning "in Core.h"

static int class = 0; // to prove I’m not compiling as C++

          struct e(fork);
typedef   struct e(fork)*                 e(fork);

          struct e(execution);
typedef   struct e(execution)*            e(execution);


          struct e(thing);
typedef   struct e(thing)                 e(thing);

          struct e(typeRepresentation);
typedef   struct e(typeRepresentation)*   e(typeRepresentation);


struct e(typeRepresentation) {
  void *                      family;
  char                        name[64]; };

struct e(thing) {
  void * const                pointer;
e(typeRepresentation) const   isa; };


# endif //!defined(TYPE_DECLARATIONS)

(また、このe()マクロは無視してください。この場合はノープです。)

4

3 に答える 3

2

以前は C としてコンパイルされていましたが、現在は C++ としてコンパイルしていますか?

C++ では、struct タグと enum タグは、他の型名と同じ名前空間に存在します。

于 2011-03-04T08:52:28.620 に答える
2

ああ、私は自分の問題を解決しました。e()問題のコードを削除して、文字通りヌープを実行するようにマクロを台無しにすることができました。:O

私はアホです。みんなの時間を無駄にしてごめんなさい。

于 2011-03-04T09:29:42.897 に答える
0

fooという名前を2つの異なるタイプに関連付けます。structfooとstructfooへのポインタは異なるタイプです。

于 2011-03-04T08:56:08.323 に答える