1

2 つのファイルmy_program.cppとそのヘッダーがありmy_program.hます。

my_program.cppこれだけが含まれています:

#include "my_program.h"
using namespace std;

my_program.hwstring次のように、を返す関数へのポインタが含まれています。

using namespace std;
typedef wstring (*my_function)(wstring, int, int, int, int);

プログラムはこの状態ではコンパイルされません (typedef で停止します... ISO C++ は型のない 'wstring' の宣言を禁止していると言っています) が、.cpp ファイルに#include <iostream>前に追加する#include "my_program.h"と、プログラムは奇跡的にコンパイルされます。

なぜこれが起こるのですか?愚かな過ちを犯さなかったことを願うばかりで、笑われることになるでしょう。

4

2 に答える 2

5

本当に含める必要があります<string>

物事の音から、あなたのコンパイラ<iostream>には が含まれ<string>ているため、動作しますが、別のコンパイラでは動作しない場合があります。C++ では、標準ヘッダーに他の標準ヘッダーを含めることができますが、必須ではありません。場合によっては、クラスの宣言のみを取得するため、機能するものと機能しないものがあります。

少なくとも私の経験では、これはコンパイラのバージョンごとに変わる可能性が高い問題でもあるため、他のものに移植するつもりがなくても、一見些細なことでコードが動作しなくなる可能性があります。正しいヘッダーを含めない限り、アップグレードしてください。

于 2012-04-10T18:45:11.073 に答える
0

追加する前#include <iostream>に、コンパイラは何が何でwstringあるかを認識していません - したがって、エラー

iostream ヘッダーをインクルードした後 (これは、std::wstringおそらくインクルードする他のヘッダーを介して定義されます)、コンパイラは何がwstring参照されているかを認識し、typedef.

心に留めておくべきことの 1 つは、コンパイラは、ヘッダーではなく、コンパイル ユニット (.cpp ファイル) と呼ばれるもののみを気にするということです。ヘッダーは、コンパイル単位にヘッダーが含まれているときに機能します (逐語的なコピー アンド ペーストを考えてください)。したがって、の前の任意の場所にiostream(または他の人が指摘したように)を含めることができます。この観点からすると、ヘッダーの前に含めることは、ヘッダーの最初の行に含めることと同じです。<string>typedef

ただし、一般的には、ヘッダーを可能な限り自己一貫性のあるものにすることをお勧めします (そのため、.cpp の代わりにヘッダーに関連するヘッダーを含めます)。そのため、インクルーダーは他のヘッダーを含める必要がありません。意図したとおりに機能させることもできます。

于 2012-04-10T18:42:29.717 に答える