2016-12-18 9 views
8

これはC++では、自動的にC++

は、Cとは異なり、標準ヘッダが他の標準ヘッダを#includeすることが許可されていることを述べているthisためのフォローアップの質問ですが中に含まれているヘッダーを知る方法はあります。

どのヘッダーがどのヘッダーに定義されているかを推測するのが難しいため、どのヘッダーが自動的に含まれているかを知る方法はありますか?

動機:私の宿題はコンパイルされ、自分のコンピュータで正しく動作しますが、TAはそれがコンパイルされておらず、コンパイルするためにいくつかのヘッダー(ミューテックスとアルゴリズム)が必要だと教えてくれました。私が将来提出するコードがどのように防弾であることを確かめることができるか。

私のコンパイラは、暗黙の宣言について警告を出すことはありません。 私はコードをコンパイルするのにclang++ -std=c++11を使用しています。

+1

オープンあなたが含むヘッダファイルは?とにかくそれがなぜ重要なのでしょうか? –

+0

標準ヘッダーには最小限の(したがって移植性のない)組み込みセットを持つ必要はありません。重複は無害です。 'cassert'は、複数回インクルードされたときに面白いことをする* only *ヘッダです。 – Hurkyl

+4

このような暗黙的にインクルードされたヘッダーには決して依存しません。実装の詳細であり、いつでも変更できます。常に明示的に必要な機能を含める。 –

答えて

5

標準では、各ヘッダーで使用可能な記号が一覧表示されます。それ以上の保証はなく、明示的に使用されているシンボルも、すべてのシンボルが宣言されていないシンボルもありません。あなたはあなたが使用している任意の名前の各ヘッダーを含める必要があります。 ではなく、は間接的なインクルードに依存しています。

肯定的な側面では、標準ライブラリヘッダーのいずれにも余分なヘッダーが必要な標準ライブラリはありません。

+0

私はC++のnoobです。mutexロックがスレッドヘッダーに定義されていると考えています。私のコンパイラには自動的にが含まれていました。だから、唯一の方法は、すべてのヘッダーをインクルードしたことを文書化し、定義されている場所を確認することです。これは正しいのですか? –

+0

@AnuragPeshne:はい、私はそれが正しいのではないかと心配しています。私はヘッダーを作成しようとしましたが、これは名前だけを利用可能にしていましたが、それは私が望んでいたほど簡単ではありません。私はそれを行う他の試みを知らない。 –

2

私が知る限り、あなたが望むことをする方法はありません。

いくつかのサンプルプラットフォームでコードをコンパイルしようとしても、それが成功した場合、他のプラットフォームでコンパイルされる可能性は高くなりますが、簡単な方法はありません。

私の経験では、MinGW C++ヘッダーはお互いに#includeを使用しています。したがって、MinGWは移植性をチェックするための実用的なツールになります。

3

特定のヘッダーファイルが取り出すその他のヘッダーを知りたい場合は、インクルードファイルを完全にコンパイルするのではなく、コンパイラのプリプロセッサフ​​ェーズで実行するのが最も簡単な方法です。あなたは<iostream>がで引っ張るかを知りたい場合たとえば、だけ含まれているファイルを作成します。

#include <iostream> 

はそれを前処理します。 gccを指定すると、-Eオプションはファイルをコンパイルせずにプリプロセッサのみを実行し、前処理されたファイルを標準出力にダンプします。結果は次のようになります。

# 1 "t.C" 

これは私の1行のソースファイルです。

# 1 "<built-in>" 
# 1 "<command-line>" 
# 1 "/usr/include/stdc-predef.h" 1 3 4 

どうやら、gccは自動的にどんな、このヘッダファイルに引っ張るん。これは無視することができます。

# 1 "<command-line>" 2 
# 1 "t.C" 
# 1 "/usr/include/c++/6.2.1/iostream" 1 3 

これで、私の最終的には、1行のソースファイル内の実際の#include文が表示されます。明らかに - "config.hのC++" ヘッダファイル、内部コンパイラのヘッダ

# 36 "/usr/include/c++/6.2.1/iostream" 3 

# 37 "/usr/include/c++/6.2.1/iostream" 3 

# 1 "/usr/include/c++/6.2.1/x86_64-redhat-linux/bits/c++config.h" 1 3 

オクラホマので、iostream自体#includeの本:私の<iostream>があるところです。

私が続けるならば、私は、<iostream>は当然、で引っ張ることstdio.hよう<ios><type_traits>、だけでなく、Cのヘッダファイルを見ることができます。

前処理段階でコンパイラを実行し、中に引っ張られてしまったすべてのヘッダファイルの素敵な、フォーマットされたリストを生成し、ヘッダファイルを取り、迅速小さなスクリプトを書くには余りにも難しいことではありません。

+0

私は '-E'フラグを渡そうとしましたが、あなたは正しいです、それは含まれている全てのヘッダに関する情報を与えています。しかし、それは初心者を混乱させる可能性のある多くのノイズを出力します(4種類のミューテックスが含まれています)。 –

+1

しかし、別の標準ライブラリを使用している人と同じ結果になるという保証はありません。質問の文脈はどちらですか? – rici