2

私はCでモジュラープログラミングを始めたばかりです。多くのエラーが発生しているため、インクルージョンで何か問題がconflicting types for 'functionName'発生previous declaration of 'functionName' was hereしていると思います。インクルージョンガードを設置しました。

Cでのモジュラープログラミング、特にインクルージョンがどのように機能するかを説明する明確なチュートリアルを知っていますか?


更新:問題を切り分けようとしました。リクエストに応じて、ここにいくつかのコードがあります。

更新2:更新されたコードは以下のとおりです。エラーも更新されました。

/*
 * main.c
 */
#include <stdio.h>
#include "aStruct.h"

int main() {
    aStruct asTest = createStruct();

    return 0;
}

/*
 * aStruct.h
 */
#ifndef ASTRUCT_H_
#define ASTRUCT_H_

struct aStruct {
    int value1;
    int value2;
    struct smallerStruct ssTest;
};
typedef struct aStruct aStruct;

aStruct createStruct();

#endif /* ASTRUCT_H_ */

/*
 * smallerStruct.h
 */
#ifndef SMALLERSTRUCT_H_
#define SMALLERSTRUCT_H_

struct smallerStruct {
    int value3;
};
typedef struct smallerStruct smallerStruct;

smallerStruct createSmallerStruct();

#endif /* SMALLERSTRUCT_H_ */

/*
 * aStruct.c
 */
#include <stdio.h>
#include "smallerStruct.h"
#include "aStruct.h"

aStruct createStruct() {
    aStruct asOutput;

    printf("This makes sure that this code depends on stdio.h, just to make sure I know where the inclusion directive should go (main.c or aStruct.c).\n");

    asOutput.value1 = 5;
    asOutput.value2 = 5;
    asOutput.ssTest = createSmallerStruct();

    return asOutput;
}

/*
 * smallerStruct.c
 */
#include <stdio.h>
#include "smallerStruct.h"

smallerStruct createSmallerStruct() {
    smallerStruct ssOutput;
    ssOutput.value3 = 41;
    return ssOutput;
}

これにより、次のエラーメッセージが生成されます。

aStruct.h:10で

  • フィールド'ssTest'のタイプが不完全です

main.c:8で

  • 未使用の変数`asTest' (これは理にかなっています)
4

3 に答える 3

3

インクルードの基本は、ヘッダーが 1 回だけインクルードされるようにすることです。これは通常、次のようなシーケンスで実行されます。

/* header.h */
#ifndef header_h_
#define header_h_

/* Your code here ... */

#endif /* header_h_ */

2 番目のポイントは、プレフィックスを使用して手動で疑似名前空間を処理することにより、起こりうる名前の競合に対処することです。

次に、パブリック API の関数宣言のみをヘッダーに入れます。これは、typedef と enum を追加することを意味する場合があります。定数と変数の宣言を含めることはできるだけ避けてください。アクセサ関数を優先してください。

もう 1 つのルールは、.c ファイルを含めず、.h のみを含めることです。これがモジュール性のまさにポイントです。別のモジュールに依存する特定のモジュールは、その実装ではなく、そのインターフェイスを知るだけで済みます。

あなたの特定の問題について、それaStruct.hを使用しますが、特に変数struct smallerStructを割り当てることができるサイズについては何も知りません。を含める必要があります。beforeをインクルードしても、コンパイル時に問題は解決しません。aStructaStruct.hsmallerStruct.hsmallerStruct.haStruct.hmain.caStruct.c

于 2010-02-19T14:27:13.503 に答える
2

複数の定義の問題は、コードを含める方法に起因する可能性が最も高いです。#include "aStruct.h" ではなく #include "aStruct.c" を使用しています。#include に加えて、.c ファイルもプロジェクトにコンパイルしていると思われます。これにより、同じ関数の複数の定義が原因でコンパイラが混乱します。

#include を #include "aStruct.h" に変更し、3 つのソース ファイルがコンパイルされてリンクされていることを確認すると、エラーは解消されます。

于 2010-02-19T21:21:14.050 に答える
0

このようなエラーは、関数宣言 (戻り値の型またはパラメーターの数/型) が他の関数宣言または関数定義と異なることを意味します。

previous declarationメッセージは、競合する宣言を示しています。

于 2010-02-19T14:45:56.027 に答える