4

タイプ「unnamed-struct」のグローバル オブジェクトを取得し、それを定義しようとしています。このような役に立たない型でグローバル名前空間を汚染したくありません (一度だけ使用されます)。

Global.h

extern struct {

    int x;

} A;

そのようなオブジェクトを定義する正しい方法はありますか?
私はこれを試していました:

グローバル.cpp

struct {

    int x;

} A = { 0 };

しかし、VS2012 は「エラー C2371: 'A' : 再定義; 異なる基本型」をスローします。ありがとう。

4

3 に答える 3

2

考えられる解決策の 1 つ: Global.h を含まない別のファイル Global_A.cpp を作成し、そこで定義しますA。等価定義規則により、無名構造体の定義が等価である限り、これは有効になります。

これはまだ悪い考えであり、ほとんどのコンパイラはそれについて警告します (gcc): warning: non-local variable `<anonymous struct> A' uses anonymous type .

于 2012-07-05T17:30:24.700 に答える
1

エラーが発生しやすいという理由だけでこれを行う方法はありません。将来、誰か (おそらくあなたも) がこの構造の定義を変更したいと思うかもしれませんが、ヘッダーとソース ファイルでこれを行うのを忘れる可能性があります。したがって、この構造体の名前を発明し、その名前をソース ファイルで使用し、その定義をヘッダーに任せる必要があります。

于 2012-07-05T17:30:02.937 に答える
0

これがお役に立てるかどうかわかりませんが、これが私の最初の投稿です...だから、気楽に。

この問題に遭遇したばかりで、構造体を操作する関数を匿名構造体を含むファイルに追加しました。そうすれば、プロジェクト内の任意のファイルからその関数を呼び出すことができ、構造体の値を操作してくれます。

次に例を示します。

header.c には、次の匿名構造体があります。

 struct 
   {    
       char  line1[80];
       char  line2[80];
       char  line3[80];
   } header;

別のファイルでコマンドラインインターフェイスを作成しているため、「interface.c」でこれらの値を操作したいと考えています。私の最初の本能は extern を使用することでしたが、header.c に次の関数を追加することは、同じかそれよりも優れているようです (避けられる場合は extern の使用を思いとどまらせる人もいます)。

void changeHeaders(char *one, char *two, char *three);
void changeHeaders(char *one, char *two, char *three)
{

    strcpy(header.line1, one);
    printf("\nHeader 1: %s", header.line1);
    strcpy(header.line2, two);
    printf("\nHeader 2: %s", header.line2);
    strcpy(header.line3, three);
    printf("\nHeader 3: %s", header.line3);

}

その関数のプロトタイプを含める限り、その関数を使用して任意のファイルからそれらの構造体変数を操作できます。それが誰かを助けることを願っています。

于 2014-09-03T19:52:17.847 に答える