コンパイル時に再定義されています。異なる基本型です。とエラーが出てしまいうまくいきません。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
wild7life

コンパイル時に再定義されています。異なる基本型です。とエラーが出てしまいうまくいきません。

#1

投稿記事 by wild7life » 11年前

初めまして、C言語を学習中のものです。

現在、構造体の学習がてら簡単なプログラムを組んでいるのですが、
件名の通りのエラーなどがコンパイル時に表示され、対処法が分かりません。

エラーが発生しないようにするにはどのように対処すればよろしいでしょうか?

以下にソースコードを貼り付けます。
開発環境は、Microsoft VisualStudio Express 2013 for Windows Desktopで、
OSはWindosw7です。

よろしくお願いします。

コード:

  
// Main.cpp
#include "stdafx.h"
#include "Teacher.h"
#include "TestPaper.h"

int _tmain(int argc, _TCHAR* argv[])
{
	Teacher* taku = New_Teacher("taku");
	TestPaper* testPaper = New_TestPaper("nobu");
	taku->Appreciate(testPaper, 100);

	return 0;
}


// Teacher.cpp

#include "stdafx.h"
#include "Teacher.h"
#include <stdlib.h>
#include <string.h>
#include "TestPaper.h"

/* 評価する */
void Appreciate(TestPaper* testPaper, int score) {
	testPaper->CompleteScore(score); /* エラー	3	error C2027: 認識できない型 'TestPaper' が使われています。*/
};

/* 初期化する */
Teacher* New_Teacher(char *name) {
	Teacher* obj = (Teacher*)malloc(sizeof(Teacher));
	strcpy(obj->name, name);
	obj->Appreciate = Appreciate;

	return obj;
}

// TestPaper.cpp
#include "stdafx.h"
#include "TestPaper.h"
#include <stdlib.h>
#include <string.h>

/* 初期化する */
TestPaper* New_TestPaper(char* name) {
	TestPaper* obj = (TestPaper*)malloc(sizeof(TestPaper));
	strcpy(obj->name, name);

	return obj;
}

/* 点数を記入する */
void CompleteScore(TestPaper* testPaper, int score) {
	testPaper->score = score;
}


// TestPaper.h
#pragma once

typedef struct _testPaper TestPaper; /*エラー	2	error C2371: 'TestPaper' : 再定義されています。異なる基本型です。*/

struct _testPaper {
	char* name; /* テストを受けた人の名前 */
	int score; /* 点数 */
	void (*CompleteScore)(int score);
};

/* 初期化する */
TestPaper* New_TestPaper(char* name);

/* 点数を記入する */
void CompleteScore(int score);

// Teacher.h
#pragma once

struct TestPaper;
typedef struct _teacher Teacher;
struct _teacher {
	char* name; /* 名前 */
	void (*Appreciate)(TestPaper* testPaper, int score);
};

/* 評価する */
void Appreciate(TestPaper* testPaper, int score);

/* 初期化する */
Teacher* New_Teacher(char *name);


box
記事: 2002
登録日時: 14年前

Re: コンパイル時に再定義されています。異なる基本型です。とエラーが出てしまいうまくいきません。

#2

投稿記事 by box » 11年前

62行目と79行目で
TestPaper
がダブっているからではないでしょうか。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

かずま

Re: コンパイル時に再定義されています。異なる基本型です。とエラーが出てしまいうまくいきません。

#3

投稿記事 by かずま » 11年前

wild7life さんが書きました:初めまして、C言語を学習中のものです。
それなら、ファイル名を
Main.c、Teacher.c、TestPaper.c にしてください。
wild7life さんが書きました:初現在、構造体の学習がてら簡単なプログラムを組んでいるのですが、
件名の通りのエラーなどがコンパイル時に表示され、対処法が分かりません。

エラーが発生しないようにするにはどのように対処すればよろしいでしょうか?
Teacher.h の中に struct TestPaper; があるので、
TestPaper は 構造体名です。

TestPaper.h の中に typedef struct _testPaper TestPaper; があるので、
TestPaper は typedef名です。

同じ名前に対して、異なる宣言をしてしまったので
「'TestPaper' : 再定義されています。...」とエラーメッセージが出ています。

対処法は、
Teacher.h の中の struct TestPaper; を
typedef struct _testPaper TestPaper; に修正する。

C ではなく、C++ を学習するのであれば、
Main.cpp などのファイル名はそのままで、
TestPaper.h の中の
typedef struct _testPaper TestPaper;
struct _testPaper {
の 2行を
struct TestPaper {
の 1行に修正する。

かずま

Re: コンパイル時に再定義されています。異なる基本型です。とエラーが出てしまいうまくいきません。

#4

投稿記事 by かずま » 11年前

かずま さんが書きました: Teacher.h の中に struct TestPaper; があるので、
TestPaper は 構造体名です。

TestPaper.h の中に typedef struct _testPaper TestPaper; があるので、
TestPaper は typedef名です。

同じ名前に対して、異なる宣言をしてしまったので
「'TestPaper' : 再定義されています。...」とエラーメッセージが出ています。
これは、ファイル名を Main.cpp のまま
C++ としてコンパイルした場合のエラーメッセージです。

ファイル名を Main.c に変更して、C としてコンパイルした場合、
struct TestPaper; の TestPaper は構造体のタグ名となり、
タグ名は、typedef名とは別の名前空間になるので
再定義のエラーにはなりません。

しかし、Teacher.h の中の
void (*Appreciate)(TestPaper* testPaper, int score);
のところで、タグ名の TestPaper がエラーになります。
これは、TestPaper.h の中の
typedef _testPaper TestPaper; がまだ宣言されていないからです。

前回述べたように、Teachar.h の中の Struct TestPaper; を
typedef _testPaper TestPaper; に修正することで解決します。

wild7life

Re: コンパイル時に再定義されています。異なる基本型です。とエラーが出てしまいうまくいきません。

#5

投稿記事 by wild7life » 11年前

所用で自宅にいなく返信が遅くなってしまい、申し訳ありませんでした。

構造体名とtypedef名の違いをまったく理解出来ておりませんでした。
解決できたと同時に勘違いしていた理解を正すことが出来てよかったです。

box様、かずま様、アドバイスの程、どうもありがとうございました。
勉強になりました。

閉鎖

“C言語何でも質問掲示板” へ戻る