1

そのため、コードのクリーンアップを検討しており、extern を宣言するヘッダーを使用して、別の cpp ファイルでグローバル定数 (たとえば、char const* 文字列) を定義することに関する提案を見つけました。その後、必要な場所にヘッダーを含めて、1 つの場所から変数にアクセスできます。

例えば

文字列.hpp

extern char const* strA;
extern char const* strB;

文字列.cpp

#include "strings.hpp"

char const* strA = "strA";    
char const* strB = "strB";

これは理にかなっていると思いましたが、しばらくして、これによりプロジェクトの大きなチャンクが不必要に再コンパイルされることに気付きました。たとえば、すべての文字列をまとめておくと、新しい文字列を追加するたびにヘッダーを変更する必要があります。これは、そのヘッダーを含むすべての cpp ファイルが再コンパイルされることを意味します。プロジェクトが複雑になるにつれて、これは合計される可能性がありますが、時間がかかるかどうかはわかりません.

この問題の解決策はアイデアを維持することだと私には思えますが、ヘッダーを含める代わりに、1 つの cpp ファイルで定数を宣言および定義します。

文字列.cpp

extern char const* strA;
extern char const* strB;

char const* strA = "strA";    
char const* strB = "strB";

次に、文字列が必要なファイルで、必要な変数を宣言します

A.cpp

extern char const* strA;

B.cpp

extern char const* strB;

基本的に、インクルードが私のために行っていたであろうことを手動で行います。

ただし、後で C.cpp で使用される char const* strC を追加する必要がある場合は、strings.cpp で extern 宣言と定義を追加し、C.cpp で再度宣言し、A.cpp と B.cpp で宣言します。再コンパイルする必要はありません。

このアプローチの欠点は、コードの重複です。変数を一度宣言して宣言を含める代わりに、使用したい場所ですべての変数を宣言する必要があります。その問題は、変数の名前を変更することにした場合、いくつかの場所で名前を変更する必要があることです。しかし、変数の名前を変更すると、宣言が含まれていたとしても、それを使用するすべてのファイルを変更する必要があります。とにかく、グローバルな名前変更を行うことができます。

複数のソース ファイルに影響を与えない変更を行った場合に、複数のソース ファイルを再コンパイルする時間のコストは、変更するかどうかに関係なく変数の名前を変更するコストよりもはるかに大きくなる可能性があるようです。それでも、言及された宣言ヘッダーが含まれていることのこの欠点を見たことがありません。

不足しているものはありますか?

4

2 に答える 2

1

複数のファイルに同じヘッダーを含めると、識別子を使用するすべてのソース ファイルで同じ宣言が表示されるようになります。これにより、エラーが減少します。

さまざまなソース ファイルで使用される宣言と使用されない宣言のさまざまなサブセットがある場合、宣言を複数のヘッダー、A.h、に分割できます。各ヘッダーには、その宣言を使用するソース ファイルのみが含まれます。次に、宣言が で変更された場合、またはを含むが含まないソース ファイルを再コンパイルする必要はありません。B.hC.hB.hA.hC.hB.h

ヘッダーで宣言が変更されることがあり、変更された宣言ではなくヘッダーを使用するソース ファイルがコンパイルされるため、ある程度、はい、不必要な再コンパイルが行われます。これは一般に、コードの重複によって引き起こされるエラーや複雑さを回避するための小さなコストと見なされます。

于 2013-09-25T03:41:54.130 に答える
1

文字列を変更した場合、その 1 つのファイルを再コンパイルするだけで済みます。文字列を追加するにはコストがかかりますが、文字列を変更するには非常に安価です。もう 1 つの利点は、すべての文字列が 1 か所にあることです。プログラムを変更したい場合は、多くのファイルを検索する必要はありません。また、プログラムを翻訳したい場合は、その方が簡単です。

プロジェクト全体に多数の文字列が分散している場合は、それらをすべて同じヘッダーに配置するのではなく、おそらくグループ化します。また、それらのいずれも使用しない場合は、そのヘッダーを含めないでください。

于 2013-09-25T02:19:23.810 に答える