9

いくつかの場所で、C構造体を安全に複数回定義できることを読みましたが、構造体を複数定義すると(複数のインクルードを介して)、gccから「構造体の再定義」エラーが発生します。非常に単純化された例は次のようになります。

foo.c:

#include "a.h"
#include "b.h"

int main(int argc, char *argv[]) {
  struct bar b;
  b.a = 2;
  return 0;
}

ああ:

struct bar {
  int a;
  int b;
};

bh:

#include "a.h"

struct buz {
  int x;
  int y;
};

実行すると、次のようgcc foo.cになります。

In file included from b.h:1:0,
                 from foo.c:2:
a.h:1:8: error: redefinition of ‘struct bar’
a.h:1:8: note: originally defined here

インクルードガードを配置していないことはわかっています。インクルードガードを使用するとコンパイルエラーが修正されますが、それでもこれは機能するはずです。struct barまた、foo.cで2つの定義を試しましたが、同じエラーメッセージが表示されますか?では、構造体をCで複数回定義できるかどうか。

4

5 に答える 5

12

Cの構造体は、安全に複数回宣言できますが、定義できるのは1回だけです。

    struct bar;
    struct bar{};
    struct bar;

バーは一度だけ定義され、何度でも宣言されるため、正常にコンパイルされます。

于 2012-04-09T15:00:22.810 に答える
0

構造体は、コンパイルするファイルごとに1回だけ定義できます。ここでは、ああを2回含めています。(1回は直接および1回はbh経由)

シンボルが特定のソースファイルに対して1回だけ定義されるように、コードを変更する必要があります。

于 2012-04-09T14:59:25.060 に答える
0

いいえ、複数回定義することはできません。そのため、#ifndefにガードを含める必要があり、それらを使用する必要があります。

持っている

#include "a.h"

bhヘッダーファイル内は、バーを再定義することを意味します。#ifndefインクルードガードがあれば、これは起こりません。

于 2012-04-09T14:59:32.707 に答える
0

ヘッダーファイルに#ifdefマクロがありません。ヘッダーを複数のソースファイルに含めると、そのエラーが発生します。

于 2012-04-09T14:59:34.567 に答える
0

同じスコープ内の同じシンボルを2回定義することはできません。おそらくあなたが言及しているのは、2つの異なるCファイルからの構造体を含めるのが安全であるということです。これは本質的にそれらが2回定義されていることを意味し(エクスポートがないため)、これらの構造体はコンパイルされているので問題にはなりません。同じメモリレイアウトに

于 2012-04-09T15:00:23.820 に答える