• ベストアンサー

ヘッダファイルでのFILE型引数宣言について

下記の(1)、(2)のファイルについての質問になります。 (1)cファイル #include <stdio.h> /******************/ /* 表示モード処理 */ /******************/ void view_mode( FILE *fp_in ) ^^^^ { char data; while( 1 ){ /* ファイルから1文字読込み */ data = fgetc( fp_in ); /* ファイルの終了かをチェック */ if(data == EOF ){ break; } /* 表示処理 */ printf( "%c", data ); } return; } (2)ヘッダファイル void view_mode( FILE *fp_in ); ^^^^ ◆質問内容 (1)にview_modeの処理を書き、(2)にview_modeのプロトタイプ宣言をしていますが、 (1)はコンパイルが通るのですが、(2)はコンパイルが通りません。 エラー内容を見ると、 エラー E2147 testddga.c 1: 引数宣言は 'FILE' で始められない と表示されてしまいます。 (1)では、引数宣言にFILEを使用しているのにコンパイルが通り、 (2)では、何故かはコンパイルが通らないので、疑問に思っております。 お手数ですが、ご教授の程お願いたします

  • KGM
  • お礼率44% (66/148)

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.2

(2)で識別子「FILE」を使用する前に #include <stdio.h> をしていないから。 識別子「FILE」はstdio.hの中で定義されています。なのでstdio.hをインクルードしてからじゃないと識別子「FILE」を使用出来ません。 stdio.hをインクルードする前に識別子「FILE」を使用してしまうと「FILE」は「単なる変数名」になってしまいます。 「エラー E2147 testddga.c 1: 引数宣言は 'FILE' で始められない」 の意味は 「引数宣言は'int i'や'char c'などのintやcharのように型名で始めなければならず、iやcやFILEなどの単なる変数名では始められない」 と言う意味です。 要は、stdio.hをインクルードして typedef struct { (略) } FILE; /* This is the FILE object */ って宣言をしてからじゃないと「FILE」って書けないのです。

その他の回答 (2)

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.3

FILEという型はstdio.hで宣言されています。 (1)はstdio.hをincludeしているのでエラーが出ませんが、(2)はしていないのでFILEが不明な識別子であるとしてエラーを出します。 (2)はヘッダーファイルだということなので、どこかの.cファイルからincludeしていると思います。includeしている.cファイル全てで(2)より先にstdio.hをincludeすればエラーは出なくなります。 あるいは(2)でstdio.hをincludeしてもエラーは出なくなります。

KGM
質問者

お礼

stdio.hをインクルードしたら、コンパイルが通るようになりました。 インクルードのし忘れが原因でしたね。 大変、失礼しました。

  • luka3
  • ベストアンサー率74% (299/401)
回答No.1

testddga.cの最初((2)のヘッダファイルをincludeする前)に #include <stdio.h> を追加して下さい。 もしくは(2)のヘッダファイルに #include <stdio.h> を含めてしまって下さい。

KGM
質問者

お礼

回答していただきありがとうございます。

関連するQ&A

  • プロトタイプ宣言について

    C言語で関数を作成しプロトタイプ宣言するときの質問です。 関数実体の引数に構造体のポインタを宣言します。 プロトタイプ宣言には,構造体のポインタを宣言したのと同じ位置にvoid *を宣言します。 関数実体とプロトタイプ宣言は,異なるファイルです。 このように作成した関数は,VC++2008では,コンパイルできるのですが, なぜ関数実体の宣言とプロトタイプ宣言の型が異なるのにコンパイルできるのでしょうか? また,この関数を別ファイルの関数から呼び出した場合,正しく引数を理解し,正しく処理されます。 これは,言語仕様として正しい書き方なのでしょうか? それとも環境依存の書き方なのでしょうか? ご存知の方がいましたらお答えお待ちしています。

  • ヘッダファイルとは?

    ヘッダファイルを作って、そこに構造体を送りたいのですが、 「引数宣言は 'data' で始められない」というエラーがヘッダファイル側で起きてしまいます。 main()で作ったからいけないのでしょうか? 分かる方教えていただけませんか? #include<stdio.h> #include "Max_Score.h" /*構造体の宣言*/ typedef struct data{ ・・・・・; }DATA; void main(){ DATA data[50]; ・・・・・・・・; Max_Score(data); } /*Max_Score()側*/ void Max_Score(data *p){ ・・・・・; }

  • ヘッダーファイルでは、他のヘッダーファイルをインクルードできないのか

    Javaを仕事で使っています。 最近趣味でC++を始めました。色々形式の違いに戸惑っています。 C++では関数を宣言しなければならないので、クラス名と同じヘッダーファイルにそのクラスで使う関数を宣言して、それをインクルードしています。 そこで今、壁にぶちあたりました。 あるクラス(仮にFooとします)の関数で、他のクラス型(Hogeとします)を引数に取りたいので、ヘッダーファイルにそれを宣言しようとしているのですが、コンパイルエラーになってしまいます。 Foo.hは以下のような感じ。 #include Hoge.h 中略 GetHoge(Hoge hoge); コンパイルエラーでは error C2011: 'Hoge' : 'class' 型の再定義 などと言われます。 クラスとその同名のヘッダーファイル、という形式を変えずに 他のクラス型を引数にとる関数を作るには、どうしたらよいのでしょうか? C++に関しては全くの素人です。詳しい方、ご教示願います。

  • 引数宣言の意味

    C++における引数宣言に関する質問です. サブルーチンに関して以下のように記述がありました. void Exam(int i,int j,double a[][NN],double &b) { b = ・・・ ; } このとき,bの宣言に&が付いていたのですが,これは どういう意味があるのでしょうか? C++の経験がないもので,よくわかりません. 基本的なことかもしれませんが,よろしくお願いいたします.

  • 関数宣言で引数に(void)というのと()の違い

    今、Atmega88をAVR Studio4 + WINAVRでC言語プログラミングを行っているのですが、 void bridge_master_oper() { ----(中略)------------- } このように宣言された関数があります。 void bridge_master_oper(void) { ----(中略)------------- } このような引数に”void”として宣言している場合と何か違いはあるのでしょうか?

  • ファイルポインタが動かない・・・

    ファイルポインタがfgetしても動かなくなるような宣言の仕方や 引数の渡し方ってあるのでしょうか? C言語で書いたプログラムです(長いので構造を書きます) わかりにくければ補足します。 #include"stdio.h" static FILE fp1; main() { 変数宣言うんぬん プロトタイプ宣言うんぬん fopen(.....); a = kansuu; fclose; } int kansuu() 変数宣言うんぬん for(i=0;i<3;i++) { x=fgetc(fp1); printf("%d-%d\n",x,ftell(fp1)); } ファイルには 0123456789 出力が 0-0 0-0 0-0 ってなるんです Seek関数(SEEK_CURとか)を使うとファイルポインタは動きます。 お願いします。

  • 対応する関数ヘッダーがありません

    最近Cを始めたばかりです。 コンパイルできなくて困ってます、意味がわかりません、 誰か教えてください。 #include <stdio.h> #include <process.h> { FILE *fp; int c; if ((fp=fopen("d:abc.txt","w"))==NULL){ printf("Can't open File\n"); exit(1); } while ((c=getchar())!=EOF) putc(c,fp); fclose(fp); } これをコンパイルしたら、 '{' : 対応する関数ヘッダーがありません (旧形式の仮引数リスト?) などと言うエラーメッセージがでます、どうすればいいのか教えてください、なにぶん始めたばかりなので、わかり易くお願いします。

  • C言語 関数プロトタイプ宣言の引数に配列を入れたいのですが

    関数プロトタイプ宣言(自作関数)の引数に、A[4][4]というような配列を入れたいのですが、コンパイル時にエラーでincompatibleといわれてしまいます。 A[0][0]からA[3][3]までを個別に引数に指定してもエラーになります。 良い方法は無いでしょうか?

  • argv( 引数 )について

    こんにちは、質問させてください。 今test.phpに引数をひとつ渡します。 test.php内では、 $name = $_GET["name"]; として受けています。 test.phpは、引数がNULLの時とそうでないときで 別処理を行うようにしています。 PHP.iniファイルのエラーメッセージを表示させるように設定していて、 引数が存在しないときに以下のようなメッセージがエラーログファイルに追加されます。 Undefined index: name in c:\htdocs\test\test.php on line 12 このメッセージが表示されること自体、たいしたエラー(?!)ではありませんが、 引数がない場合、実行する度に上記のメッセージがでるのはあまり 面白くないので、表示させたくないようにしたいのですが, どのようにすればいいでしょうか? 宜しくお願い致します m(_ _)m

    • ベストアンサー
    • PHP
  • VisualC++でクラスのヘッダーファイルの書き方がわかりません

    今、Visual C++(CLR)を使って、MultiClassという名前のクラスを作っています。 クラスの作り方は大体わかったのですが、 疑問が出ました。以下のように記述するとエラーが発生してしまいます //クラスのヘッダーファイル #pragma once ref class MultiClass { public: void MultiClass(void); }; //クラスのCPPファイル #include "StdAfx.h" #include "MultiClass.h" void MultiClass::MultiClass(void) { } //エラー名 エラー 1 error C2380: 前の型 'MultiClass' (コンストラクタが戻り値の型を返すか、またはクラス名を再定義しています。) エラー 2 error C2533: 'MultiClass::{ctor}' : コンストラクタの宣言に戻り値の型が含まれています。 ヘッダーで先頭voidを消して、CPPの先頭voidを消したら正常に 動作するのですが、普通、 戻り値 メソッド名 (引数) なのに、なぜエラーが発生するのですか? さらに2行目以降はなぜ、 void を先頭につけないと エラー 2 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません というエラーが発生するのでしょうか? ネットで調べてもまったくわかりません わかる方お願いします

専門家に質問してみよう