2017-02-03 5 views
0

現在、私はCプロジェクトで作業しています。コードを整理しておくためにインクルードファイルを使用しています。 1つのファイルincludes.hにはtypedefがあり、別のインクルードファイルutil.h/util.cにアクセスすることはできません。私はmain.cの両方に次の順序で含めました:includes.hutil.hC - typedefのインクルードファイル

main.c

#include <stdio.h> 
#include <stdlib.h> 
//similar includes 

#include "includes.h" 
#include "util.h" 

int main() 
{ 
    MyStructType somename; 
    somename.number = 5; 

    util_foo(somename); 
    return 0; 
} 

includes.h

#pragma once 
struct structname 
{ 
    int number; 
}; 

typedef struct structname MyStructType; 

util.h

#pragma once 

#include "includes.h" //added line (>accepted answer) 

int util_foo(MyStructType blabla); 

util.c

#include <stdio.h> 

#include "util.h" 

int util_foo(MyStructType blabla) 
{ 
    printf("%d\n", blabla.number); 
    return 0; 
} 

私は、このコマンドでコンパイルします。gcc -o main *.c

しかし、これはコンパイルされません、あなたはこれが動作しない理由を任意のアイデアを持っていますか?または、プロジェクトの構造を完全に変更せずに修正する方法は?


編集: 持つ#pragma once交換することをお勧めします。あなたはあなたのコードのコンパイルを行うためにutil.h

#include "includes.h" 

を追加する必要が

#ifndef STH_SIMILAR_TO_FILENAME 
#define STH_SIMILAR_TO_FILENAME 
//code 
#endif 
+2

コンパイラのエラーに関する質問には常に完全なエラーメッセージが含まれている必要があります。 – user694733

+0

次回はそれは明白なエラーではないので必要ではないと思っていたが、システムを後ろから取り戻すのは間違っている。 – Zonko

+0

個人的に、私は '#pragma once'が好きではありません。それは非標準であり、深刻でIMOの致命的な欠陥が1つあります。 http://stackoverflow.com/questions/787533/is-pragma-once-a-safe-include-guard –

答えて

1

を。


あなたはmain.cからutil.hMyStructTypeのtypedefを取得するために推移#includeディレクティブに頼っているので、これはですが、util.cで同じことをやっていません。 (保守目的のために)

最善の解決策は推移介在物に頼る最小限に抑えることである:それは(util.hに、このケースでは)を必要としていますどこにincludes.hを含める必要があります。

+0

ありがとう、これは働いた! – Zonko