[1711] Re:構造体へのポインタを返す関数
投稿者:ti
2011/03/21 02:28:24
tiと申します。
自分の勉強のため回答させていただきますので、
前橋さん間違いや補足のご指摘お願いします。
main.cの中で
>#include "File1.h"
>#include "File2.h"
となっていて、
>static KOUZOU1 *func();
>static KOUZOU2 *func(); /* ここがエラーになります:error: conflicting types for 'func' */
で 展開後にfunc識別子が重複していることが原因です。
どちらかと関係するところを変えればコンパイルできるはずです。
なお、static宣言はmain.cなど、公開したくないソースに対してのヘッダファイルに
含めるべきでないと思います。
公開用(extern宣言の関数)と非公開用(ある関数だけで使うstatic宣言の関数)で
ヘッダファイルは分けるべきです。
また、ヘッダファイルは二重展開防止機能をつけておきましょう。
#ifndef FILE1_H
#define FILE1_H
~
#endif
以上
>お返事遅れました。
>(ぱ)さん、yuyaさん、ありがとうございます。
>(ぱ)さんの回答にひもづけて続けます。
>
>下記がサンプルコードとエラーメッセージです。
>(環境はMac OSXのXcode3.2.4です。)
>
>main.c
>--------------------------------------------------
>#include "File1.h"
>#include "File2.h"
>
>int main (int argc, const char * argv[]) {
>
> file1();
> file2();
>
> return 0;
>}
>--------------------------------------------------
>
>File1.h
>--------------------------------------------------
>typedef struct KOUZOU1_tag {
> int var;
>} KOUZOU1;
>
>void file1();
>static KOUZOU1 *func();
>--------------------------------------------------
>
>File1.c
>--------------------------------------------------
>#include <stdio.h>
>#include <stdlib.h>
>#include "File1.h"
>
>void file1() {
> KOUZOU1 *kouzou;
> kouzou = func();
>
> printf("%d\n", kouzou->var);
>}
>
>static KOUZOU1 *func() {
> KOUZOU1 *kouzou;
>
> kouzou = malloc(sizeof(KOUZOU1));
> kouzou->var = 1;
>
> return kouzou;
>}
>--------------------------------------------------
>
>File2.h
>--------------------------------------------------
>typedef struct KOUZOU2_tag {
> int var;
>} KOUZOU2;
>
>void file2();
>static KOUZOU2 *func(); /* ここがエラーになります:error: conflicting types for 'func' */
>--------------------------------------------------
>
>File2.c
>--------------------------------------------------
>#include <stdio.h>
>#include <stdlib.h>
>#include "File2.h"
>
>void file2() {
> KOUZOU2 *kouzou;
> kouzou = func();
>
> printf("%d\n", kouzou->var);
>}
>
>static KOUZOU2 *func() {
> KOUZOU2 *kouzou;
>
> kouzou = malloc(sizeof(KOUZOU2));
> kouzou->var = 2;
>
> return kouzou;
>}
>--------------------------------------------------
>
>エラーは
>error: conflicting types for 'func'
>というもので
>File2.h の static KOUZOU2 *func();
>の所に出ます。
>
>ちなみに
>error: previous declaration of 'func' was here
>というメッセージも同時に出て、開くと
>File1.h の static KOUZOU1 *func();
>を指していました。
>
>やっぱりstaticを付けているのに
>「funcさっき宣言したじゃん!」と言われているようなんですが、
>いかがでしょうか。
>
>うーん、どこを勘違いしてるんだろうか。。。
>
>よろしくお願いします!
>
>P.S.
>「記憶クラス指定子」「型修飾子」の違いなど、
>自分で間違えて指摘されるとスムーズに理解しやすいですね。
>本で読むときはつい飛ばしてしまいがちですが(笑