4

私はいくつかの仕事をする機能を持っています。

ああ

void doSomething(int n);

A.cpp

#include "A.h"

void doSomething(int n) {
    /* something */
}   

この関数を別のソース ファイルで使用したい場合、最適な選択は次のとおりです。

1) ああを含む

B.cpp

#include "A.h"

void anotherTask() {
    // ...
    doSomething(5);
    // ...
}

2) または前方宣言 (関数プロトタイプ) を使用します。

B.cpp

void doSomething(int);

void anotherTask() {
    // ...
    doSomething(5);
    // ...
}

クラスに対してできるだけ頻繁に前方宣言を使用するためのヒントがたくさんあります。では、関数の前方宣言のベスト プラクティスは何ですか?

UPD

わかりました、これは簡単すぎる例です。

ヘッダー Ah にゴミがある場合 (ドライバーレベルについて何も知らない B.cpp と比較して):

ああ

#include "specific_driver_header.h" /* some lowlevel stuff that B.cpp couldn't know */

#define SPECIFIC_DRIVER_DEFINES 0xF0  /* useless define for B.cpp that uses global namespace */

void doSomething(int n);   /* only significant function for B.cpp */

Ah を B.cpp に含めると、B.cpp はドライバーに依存しなくなります。その場合、バリアント (2) を使用する必要がありますか?

4

2 に答える 2

6

可能な限り、常にヘッダーでプロトタイプを使用してください。これにより、一方の場所を誤って変更して、もう一方の場所を変更することを防ぎます。

たとえば、関数を次のように変更します。

void doSomething(long n);

関数の定義と b.cpp プロトタイプの変更です。

ヘッダーがある場合、コンパイラは少なくとも「これは間違っているようです」と通知する可能性があります。後半にリンカーエラーが発生するのではなく...

于 2013-02-08T14:13:21.120 に答える
5

関数がそのファイルでのみ使用される場合にのみ、前方宣言を使用します。

他のユニットで使用できるようにする場合は、ヘッダー ファイルを使用し、前方宣言は使用しません(循環依存などの非常に特殊な問題を解決する場合を除きます)。両方を使用しないでください。複数の場所で同じ宣言をしないでください。

編集

クラスの前方宣言は、あなたが尋ねたものとは別のケースです:

可能な限り、インクルードの代わりに前方宣言を使用する必要がありますか?

あなたのアップデート

そのようなヘッダーファイルを書かないでください。これが簡単な答えです。ヘッダー ファイルは、可能な限り自己完結型である必要があり、「パブリック」インターフェイスに関係のないものは含まれません。(C++ クラスを宣言するときに、保護されたメソッドとプライベート メソッドを同じ 'public' ヘッダー ファイルに入れる必要があるため、'public' を引用符で囲みます。そこにいる。)

とはいえ、どうしようもない場合は、宣言を複製するよりも、関連するヘッダー ファイルをインクルードする方がよいでしょう。通常、保守性はコンパイル速度よりも重要です。

于 2013-02-08T14:11:02.793 に答える