1

次のプログラムでは、構造体を関数に渡そうとしています。しかし、エラーが発生し、その理由がわかりません。このプログラムで私が犯した間違いは何ですか?

このプログラムgccのコンパイルに使用しています。c

#include <stdio.h>

struct tester {
  int x;
  int *ptr;
};

void function(tester t);

int main() {
 tester t;
 t.x = 10;
 t.ptr = & t.x;
 function(t);
}

void function(tester t) {
   printf("%d\n%p\n",t.x,t.ptr);
}

エラー:

gcc tester.c -o tester

tester.c:8:15: error: unknown type name ‘tester’
tester.c: In function ‘main’:
tester.c:12:2: error: unknown type name ‘tester’
tester.c:13:3: error: request for member ‘x’ in something not a structure or union
tester.c:14:3: error: request for member ‘ptr’ in something not a structure or union
tester.c:14:13: error: request for member ‘x’ in something not a structure or union
tester.c: At top level:
tester.c:18:15: error: unknown type name ‘tester’

:とを 置き換えprintfて拡張子を(!) にすると、エラーは発生しません。何故ですか ?を使用してコンパイルするのも不思議ではありませんcoutstdioiostream.cppg++

4

3 に答える 3

5

構造体を typedef しない場合は、次のように宣言する際に、構造体名の前に struct を指定する必要があります。

struct tester t;

それを行うか、次のことを行います。

typedef struct {
  int x;
  int *ptr;
}tester;

アップデート

以下は、次の投稿からの Adam Rosenfield の引用です C++ の 'struct' と 'typedef struct' の違い? :

C++ では、すべての struct/union/enum/class 宣言は、同じ名前の別の宣言によって名前が隠されていなければ、暗黙的に型定義されているかのように動作します。

于 2012-10-25T16:09:43.227 に答える
1

あなたの構造体には名前がありません。タイプ定義を使用struct tester t;または使用する

于 2012-10-25T16:09:06.343 に答える
0

問題は、「c 言語」コンパイラである gcc でコンパイルしようとしていて、C++ スタイルのコードに従っているということです。structname variablename;
だけで構造体変数を作成することができます。 しかし、C++ では、それがstruct structname variablename;のような構造体であることをコンパイラに明示的に伝える必要があります。 それを行うだけで問題ありません。それ以外の場合は、基本的にコンパイラフォームに、構造体テスターをテスターのみに呼び出すことを伝える typedef を使用できます。変化する。

于 2015-11-22T04:35:09.367 に答える