1

ソースファイルから関数宣言を省略してもよい状況はありますか?コンパイルされないCプロジェクトがありますが、その理由はわかりません。私が判断できる限り、コンパイラ(GCC 4.4.1)は、「system.h」の関数「sysData」の宣言に到達したときに、「sepData」typedefの宣言を見つけることができません。

sepsis.hから

typedef struct {
    int16 intensity;
    int16 offset;
} sepData;

sepsis.cから

sepData sepR, sepIR;

system.hから

void sysData(sepData *sepR, sepData *sepIR);

system.cから

#include "system.h"
#include "sepsis.h"

extern sepData sepR, sepIR;

void sysData(sepData *sepR, sepData *sepIR)
{
}

'sysData'の宣言を'system.h'から削除すると、プロジェクトはエラーなしでコンパイルされます。Cについてはよく知らないので、そのような宣言を含めることは必須だと思いました。誰かがここで何が起こっているのか説明できますか?

4

2 に答える 2

2
#include "system.h"
#include "sepsis.h"

そうsystem.hでない場合は、関数のプロトタイプを作成するときに#include "sepsis.h"タイプsepDataがわからずsysData()、エラーメッセージが表示されます。2つのヘッダーの順序を入れ替えることで、この問題を解決できる可能性があります。

#include "sepsis.h"
#include "system.h"

しかし、それはこの特定のコンパイル単位を修正するだけです。このアプリケーションに他のコンパイルユニットがある場合は、#include行の順序に注意する必要があり、面倒になります。おそらくそれ自体system.hが必要であり、通常の呪文による複数の包含を防ぐ必要があります。#include "sepsis.h"sepsis.h

#ifndef _SEPSIS_H_
#define _SEPSIS_H_
...
#endif // _SEPSIS_H_

関数の宣言前に関数を使用sysData()していなかったため、コードベースはプロトタイプなしでコンパイルできました。宣言の前に関数を使用した場合、コンパイラーは警告メッセージを表示し、すべての引数がであり、戻り型もであると想定していると思います。(古いK&Rルール。)もちろん、これは機能しませんが、なぜ機能しないのかは明らかではないかもしれません。(Yay C.)intint

于 2012-06-13T23:21:20.767 に答える
2

を含める場合system.h、タイプはまだ宣言されていませんsepData

インクルードの順序を切り替えて、再試行してください。

#include "sepsis.h"
#include "system.h"

extern sepData sepR, sepIR;

//you might also want to re-think your arguments' names
void sysData(sepData *_sepR, sepData *_sepIR)
{
}
于 2012-06-13T23:19:39.627 に答える