1. ホーム
  2. c++

[解決済み] なぜ std::max と std::min は #include <algorithm> していなくても使えるのですか?

2022-01-29 11:22:56

質問

#include <iostream>

int main()
{
   int value1 = 1, value2 = 10;
   std::cout << "Min = " << std::min(value1,value2) <<std::endl;
   std::cout << "Max = " << std::max(value1,value2)<< std::endl;              
} 

私の知る限りでは minmax 関数が定義されています。 <algorithm> .

もしプリプロセッサで <algorithm> なぜこのコードはまだ動作するのでしょうか?

解決方法は?

おそらく iostream を定義する他のヘッダーを直接または間接的に含んでいます。 std::minstd::max . (おそらく algorithm 自体が含まれています。おそらく、C++の標準ライブラリを実装するために使用される内部ヘッダーが含まれているのでしょう)。

この動作に依存してはいけません。インクルード algorithm は、std::min と std::max が必要な場合です。

モジュールが他のモジュールをインポートでき、そのインポートから何もエクスポートさせないモジュールシステムを持つ言語(例えばRacketのモジュールシステム)に慣れている場合、この動作は混乱する可能性があります。

しかし、#include はテキストを置換していることを思い出してください。.cppファイルから#include行が削除され、それが指していたファイルの内容に置き換わります。

ほとんどのコンパイラーは、プリプロセッサーを実行したときの出力をダンプするオプションがあるので、何が何を含んでいるかを追跡することができます。kmortの回答に対するコメントで、Visual Studio Expressを使用していると言っていますね。コマンドラインから プリプロセスでファイルからファイルへ Visual C++ コンパイラを使用する場合は cl /P foo.cpp . この出力を使用すると、定義された std::max は実装固有のヘッダである xutility . (キャレットを "std:max" の中に入れて Visual Studio で F12 を押すとさらに早いです :-] ).

kmortはまた /showIncludes コンパイラのスイッチです。これを使えば、インクルードチェーンを簡単に突き止めることができます。以下は、私が実行したときの縮小出力です。

Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\iostream
Note: including file:  C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\istream
Note: including file:   C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\ostream
Note: including file:    C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\ios
Note: including file:     C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\xlocnum
Note: including file:      C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\streambuf
Note: including file:       C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\xiosbase
Note: including file:        C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\xlocale
Note: including file:         C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\stdexcept
Note: including file:          C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\xstring
Note: including file:           C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\xmemory0
Note: including file:            C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\xutility