2012-05-04 5 views
4

別のファイルに.cファイルを含めたい。それは可能でしょうか? .cファイルにヘッダファイルを含めるとうまく動作しますが、別の.cファイルに.cファイルを含めるとうまくいきません。
私は、Visual Studioを使用していると私は次のエラーを取得する:cファイルを別のファイルにインクルード

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コーダーを求める時間。 :)

+2

どのようにリンクしていますか? –

+2

'* .c'ファイルを別の' * .c 'の中に入れることは、初心者のために非常に貧弱です。専門家に任せてください。 –

+2

@BasileStarynkevitch:専門家にとっても悪い習慣です。大規模な翻訳単位をコンパイルしようとするよりも、小規模の翻訳単位をコンパイルしてリンクすることは、狂ったことではありません。 –

答えて

0

あなたは、おそらくこの関数は、あなたが一つの定義を削除する必要があります

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

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

で1〜2回定義しました。

+0

@Bernoitそれは事実ではない – Andrew

+3

@Andrew:リンカを信じて、それは分かっている。 –

8

これは機能しますが、プログラムの作成方法には注意が必要です。また、コメントで指摘されているように、一般的には悪い考えです。予期せぬことで、これらのような問題が生じます。特に些細なプログラムのようなものの場合、ベネフィットはほとんどありません。あなたはおそらくこのアプローチをすべて再考すべきです。

このようなことをした後は、main.cをコンパイルし、それをsayHello.cのコンパイル結果とリンクしないようにしてください。

Visual Studioにexclude the latter file from the buildと伝える必要があります。

+0

ビルドから除外するにはどうすればよいですか? – Andrew

+1

@Andrew私はそれについての質問にリンクしました。 :) – unwind

1

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

これは、main.objではインクルードのためにsayHello()関数があるからです。

0

sayHello.h

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

main.cの

#include "sayHello.h" 

int main() 
{ 
    sayHello(); 
    return 0; 
} 
10

I want to include a .c file in another.

んが、あなたはそうではないん。あなたは本当にそうではありません。 のステップをこのパスに適用しないでください。痛みと悲惨さで終わるだけです。これはあなたの例のような簡単なプログラムであっても、実際の複雑さのプログラムにはあまりないほど悪い習慣です。 1つのファイルで些細な1行の変更を行うには、そのファイルとそれを含むものの両方を再構築する必要があります。これは時間の無駄です。データと関数へのアクセスを制御する機能が失われます。 のすべての.cファイルは、包含ファイルに表示されます。関数およびファイルスコープ変数もstaticと宣言されています。別の.cファイル(.cファイル)を含む.cファイルを含む.cファイルを含む場合、コンパイラが処理するには大きすぎる変換単位で処理できない可能性があります。

個別のコンパイルとリンクは明確な良いことです。あなただけのファイルに含める必要があります。cファイルはインタフェース(型定義、関数プロトタイプ宣言、マクロ定義、外部宣言)を記述するヘッダファイルであり、実装ではありません。

関連する問題