5

今日、私はそこでインタビューを受け.c file、ソース ファイルにインクルードできるかどうか尋ねられました。私は言っyesた。数年前、私は彼らが include を持っているいくつかのプロジェクトで同じことを見たから.c fileです。しかし、ちょうど今、私は同じことを試みていました。

abc.c

#include<stdio.h>
void abc()
{ printf("From ABC() \n"); }


main.c

#include<stdio.h>
#include "abc.c"
int main()
{   void abc();
    return 0;
}

エラーの取得:

D:\Embedded\...\abc.c :- multiple definition of 'abc'

どこが悪いのでしょうか?

abc.h ファイルを作成し (abc.h の本体は{ extern void abc(void); })、そのファイルをインクルードabc.c(コメント アウト#include abc.c) しました。うまくいきました。

4

4 に答える 4

17

次のように実行します。

abc.c:

#include <stdio.h>
void abc()
{printf("From ABC() \n");}

main.c:

#include<stdio.h>
#include "abc.c"
int main()
{   
    abc();
    return 0;
}

(ヘッダーファイルは必要ありません)

次に、コンパイルするには、コンパイルするだけですmain.c。との両方をコンパイルしようとしないでください。関数が 2 回定義されてしまうからです。 abc.cmain.cabc()

#includeそれは基本的に「コピー&ペースト」であり、それ以上のものではないことを理解する必要があります。#include "abc.c"を指定すると、単に の内容を取得abc.cしてファイルに「貼り付け」ますmain.c。したがって、上記の for を使用するmain.cと、プリプロセッサが処理した後、次のようになります ( smain.cは無視しています)。#include <stdio.h>

#include<stdio.h>
#include <stdio.h>
void abc()
{printf("From ABC() \n");}
int main()
{   
    abc();
    return 0;
}

これは有効なプログラムです。

つまり、通常はこれを行うべきではありません。すべての.cファイルを個別にコンパイルしてから、それらをリンクする必要があります。

于 2012-07-04T19:14:50.530 に答える
6

C ファイルをインクルードすることは、インクルードされた C ファイルを単独でコンパイルしてから、他のファイルをインクルードした C ファイルのオブジェクト ファイルと一緒にリンクしようとしない限り、完全に有効です。

そうすると、同じシンボル (通常は関数) が 2 つのファイルで定義され、投稿したエラーが発生します。

複数のソース ファイルがある場合は、通常、それらを含めずに個別にコンパイルします。次に、リンカーはオブジェクト ファイルを 1 つの実行可能ファイル (またはライブラリ) にマージします。

于 2012-07-04T19:17:41.403 に答える
4

任意の拡張子のファイルを含めることができます。

あなたのプログラムではvoid abc();、main() で再定義しました。代わりにステートメントを置くabc ();

于 2012-07-04T19:23:00.443 に答える
2

プリプロセッサはファイル拡張子を気にしません。ヘッダーに「.h」、ソース ファイルに「.c」または「.cpp」という名前を付けるのは、一部の伝統にすぎません。

プロジェクト全体をコンパイルした後、リンカの問題が発生しないようにする必要があります (たとえば、"abc.c" と "main.c" の両方をコンパイラに渡すと、関数が複数定義されることになります)。

于 2012-07-05T06:34:26.627 に答える