11

.c ファイルを別のファイルに含めたい。可能ですよね?ヘッダー ファイルを .c ファイルにインクルードするとうまくいきますが、別の .c ファイルに .c ファイルをインクルードするとうまくいきません。
Visual Studio を使用していますが、次のエラーが発生します。

main.obj : error LNK2005: _sayHello already defined in sayHello.obj  
/* main.c  */
#include "sayHello.c"

int main()
{
    return 0;
}  
/* sayHello.c */

#include <stdio.h>

void sayHello()
{
    printf("Hello World");
}

このエラーが何を意味するのかわかりません。より高度な C コーダーに質問する時間です。:)

4

8 に答える 8

28

.c ファイルを別のファイルに含めたい。

いいえ、ありません。あなたは本当に、本当にしません。この道を一歩踏み出さないでください。それは痛みと悲惨さで終わるだけです。これは、例のような些細なプログラムであっても悪い習慣であり、実際に複雑なプログラムではなおさらです。1 つのファイルをわずか 1 行変更すると、そのファイルとそれを含むすべてのファイルの両方を再構築する必要があり、時間の無駄になります。データや機能へのアクセスを制御できなくなります。インクルードされた .c ファイル内のすべてが、インクルード ファイルに表示されます。宣言された関数やファイル スコープ変数も含まれますstatic。別の .c ファイルをインクルードする別の .c ファイルをインクルードする .c ファイルをインクルードすると、コンパイラが処理するには大きすぎる翻訳単位になる可能性があります。

個別のコンパイルとリンクは、明確な利点です。.c ファイルに含める必要がある唯一のファイルは、実装ではなく、インターフェイス(型定義、関数プロトタイプ宣言、マクロ定義、外部宣言) を記述するヘッダー ファイルです。

于 2012-05-04T14:13:38.080 に答える
11

動作しますが、プログラムの作成方法には注意が必要です。また、人々がコメントで指摘しているように、それは一般的に悪い考えと考えられています. それは予期せぬことであり、このような問題を引き起こします。特に些細なプログラムのように見えるものについては、利点はほとんどありません。おそらく、このアプローチを完全に再考する必要があります。

このようなことを行った後は、コンパイルするだけでmain.c、コンパイルの結果とリンクしようとしないでsayHello.cください。これは、実行しているようです。

ビルドから後者のファイルを除外するように Visual Studio に指示する必要がある場合があります。

于 2012-05-04T11:37:02.890 に答える
2

これはリンカー エラーです。すべての .c ファイルを .obj ファイルにコンパイルした後 (コンパイラによって行われます)、リンカーはそれらを「マージ」して dll/exe を作成します。リンカーは、2 つのオブジェクトが同じ関数を宣言していることを検出しました (これは明らかに許可されていません)。この場合、リンカーは main.obj のみを処理し、sayhello.obj も処理しないようにします (そのコードは既に main.obj に含まれているため)。

これは、main.obj には、インクルードにより sayHello() 関数も含まれているためです。

于 2012-05-04T11:39:29.357 に答える
0

この関数を 2 回定義した可能性があります

void sayHello()
{
printf("Hello World");
}

現在のファイルに 1 つ、sayhello.c に 1 つ

1 つの定義を削除する必要があります。

于 2012-05-04T11:36:49.740 に答える
0

sayHello.h

#include <stdio.h>
void sayHello(void);

main.c

#include "sayHello.h"

int main()
{
    sayHello();
    return 0;
}  
于 2012-05-04T13:06:10.237 に答える
0
//THIS IS THE MAIN FILE//
#include "test.c"
int main()
{
    multi(10);
}


//THIS IS THE TEST FILE//
#include<stdio.h>
void multi(int a)
{
    printf("%d",a*2);
}

注意点:

  1. ここでは、「main()」関数を含むプログラムを実行する必要があります。
  2. main 関数で "stdio.h" ヘッダー ファイルを回避できます。なぜなら、すでに「stdio.h」ヘッダーファイルを含むファイルをインクルードしているためです。
  3. 「メイン」ファイルから関数を呼び出す必要があります。
  4. インクルード ファイルは、「file_name.h」ではなく「file_name.c」にする必要があります。通常、ヘッダー ファイルには .h 拡張子を使用するためです。ヘッダー ファイルではなく別のプログラム ファイルをインクルードしているため、.c を使用する必要があります。そうしないと、致命的なエラーが発生し、コンパイルが終了します。
于 2021-05-07T05:41:07.043 に答える