-3

だから私は提出する必要がある2つのファイルを持っています、それらを呼び出します:example.ccとexample.h

彼らのテスト コードには #include "example.h" のみが含まれると言われています。

通常、私は常に #include "example.cc" を使用してきました。これは、すでに宣言に example.h が含まれているためです。

テストコードを実行すると、テストコードで例に言及するたびに「example::example ..への未定義の参照」が表示されます。これは明らかに、テストコードが実際の宣言ではなく、example.hの宣言のみを表示できるためです。実装。

私は何が欠けていますか?#include example.cc を example.h にしようとしましたが、これは明らかに正しくありません。

4

3 に答える 3

3

あなたの教授は、professor_main.ccなどの他のファイルを持っている可能性が高く、プロジェクトを次のようにコンパイルします。

g++ example.cc professor_main.cc -o project

彼らのprofessor_main.ccには行があります

#include "example.h"

また、いくつかの関数を使用し、それらが正しいことを行っていることをテストする可能性があります。

std::cout << (example_add(2,3) == 5) ? "good" : "bad" << std::endl;

ここで、example.h を #include しなかった場合、またはそのファイルを正しく作成しなかった場合、professor_main.cc でコンパイル エラーが発生します。ヘッダー ファイルにある必要があり、このエラーを解消する重要な行は次のとおりです。

int example_add(int a, int b);

これを関数宣言と呼びます。

ヘッダーですべてが正しく行われているのに、教授が間違って example.cc なしでプロジェクトをコンパイルしようとした場合、次のようになります。

g++ professor_main.cc -o project

次に、example_add() への「未定義の参照」に関するリンカエラーが発生します。

欠けているのは関数定義です:

int example_add(int a, int b) { return a + b; }

これは example.cc ファイルにあるはずです。教授がそれをコンパイル コマンド ラインに含めていれば、すべて問題ないはずです。

ただし、ヘッダーファイルに「example.cc」を #include した場合、すべてがうまくいきません。事実上、example.cc をコピーして、professor_main.cc に貼り付けることができます。これはそこに #include されているためです。しかし、それは明らかに独自のファイル、example.cc にもあります。あなたの教授がこれをやろうとした場合:

g++ example.cc professor_main.cc -o project

関数 example_add() が2 回定義されているため、リンカーから複数定義エラーが発生します。

一般的には、すべての関数定義をソース ファイル (.cc) に配置し、すべての関数宣言をヘッダー ファイル (.h) に配置することをお勧めします。別の .cc ファイルを自分でコンパイルしてみて、どのように機能するかを確認してください。

于 2013-03-26T18:39:01.337 に答える
1

C++ (およびその派生元である C) では、ヘッダーファイル ( *.hC では、C++ では拡張子なし) には宣言 (インライン関数を除いて実行可能コードはありません) が含まれ、コード ファイル ( *.c in C,* in C++) contain all executable code, and.cc #include`必要なものを宣言するヘッダー 宣言の違いによるバグの追跡が困難になるのを避けるために、より広く使用するためにいくつかのファンキーなクラスを実装するファイルには、宣言されているヘッダーも含める必要があることに注意してください。

C/C++ プリプロセッサは愚かな獣です。テキストを置き換え#include、ファイルの内容をそのままコピーするだけです。#incudeしたがって、 d ファイル内でステートメントを開始して外部で終了する、またはヘッダーに実行可能コードを含めるなど、あらゆる種類の奇妙なゆがみを行うことができます。私はコンパイルして問題なく動作しますが、本当に重要なのは、次にコードを読む人がそれを理解できるかどうかです (つまり、数日後にあなたを意味します)。あなたの TA は、コードの整理が不十分であることに苦しむことはありません。彼女は鼻にしわを寄せて、あなたに F を与えるだけです

彼らがおそらく意味することは、実装する必要がある、たとえば、ヘッダーファイルでclass foo使用するために必要な宣言を与える必要があるということです(そして、未処理の大衆がどのように機能するかについて見る必要があるものだけです!)、および実際の実装を提供するコードファイル。クラスをテストするために、どのインクルードとリンクを提供します。class foofoo.hclass foofoo.ccbar-uses-foo.ccfoo.hfoo.o

于 2013-03-26T18:39:10.497 に答える
0

コンパイラを使用してファイルをリンクしてからビルドする必要があります。もう 1 つのことは、ヘッダー ファイルを除く各ファイルに、ヘッダーを含める必要があることです。

このような何かが役立つはずです

gcc -c example.c -o example.o
gcc example.o -o example

ヘッダーを使用する別のファイルを追加する場合:

gcc -c file1.c -o file1.o 
gcc -c file2.c -o file2.o
gcc file1.o file2.o -o myprogram

gccおよびという用語g++は、Linux と Unix の両方のコンパイラーです。Windows dev c++ を使用している場合は、Windows で動作するかgcc を使用する必要があります

于 2013-04-12T17:04:05.073 に答える