C++の超初心者です。コードの書き方の作法について、教えてください。
今、
・main関数のあるmain.cpp
・main内で使う関数Aを宣言した functions.h
・関数Aを定義した functions.cpp
があって、
この関数Aの戻り値が「string型」であったとします。
-----------
このとき、まずfunctions.hの中で
#include <string>
が必要になるわけですが、そうしておけば、
functions.cppでは
#include "functions.h"
をする時に関節的に<string>がincludeされますので、
#include <string> は書かなくても良いことになります。
-----------
しかし、そうすると、このfunctions.cppのソース単体だけを見た時、
#include <string> をしていないのに、中ではstring型をバンバン使用しているという、
ちょっと気持ちが悪い状態になってしまいます。
また、もしmain.cppの中でstring型が使いたくなったときも、
#include "functions.h"をしておりますから、
main.cppに#include <string>は必要ないということになります。
しかし、これもやはりなんだか気持ちが悪い状態です。
また、将来的に関数Aがいらなくなった時、不用意に#include "functions.h"を外すと、
<string>がincludeされていない状態になり、混乱を招くような気がします。
-----------
かといって、二重・三重にincludeを命令することを承知で
(インクルードガードがあるから問題は生じないだろう、という期待をこめて)
functions.cppやmain.cpp内で #include <string> をするのも、よろしくないように思います。
(<string>の中身が何度も展開されてしまい、無駄にコンパイルに時間がかかるので)
この「気持ち悪さ」をうまく払拭する方法、正しく払拭する方法はあるのでしょうか。
No.1ベストアンサー
- 回答日時:
「stringを使うには、ソースファイルに #include <string> を書かなければならない」
「function.cppでstringを使うのなら、 function.h に #include <string> を書かなければならない」
って思い込みを変えることでしょう。
> 将来的に関数Aがいらなくなった時、不用意に#include "functions.h"を外すと、
> <string>がincludeされていない状態になり、混乱を招くような気がします。
これが考えられるなら「 function.h に #include <string> を書かない」ことです。
ライブラリを見ていると、「 XXsub.h を使う場合は先に XXcore.h をincludeしておく」といった使い方をしているものをよく見かけます。
同様に、 「function.hを使うときには、先に#include <string>しておく」と決めてしまいましょう。
includeを忘れたところで、コンパイル時にエラーになるだけです。
お返事ありがとうございます。
> 「stringを使うには、ソースファイルに #include <string> を書かなければならない」
> 「function.cppでstringを使うのなら、 function.h に #include <string> を書かなければならない」
> って思い込みを変えることでしょう。
そうだったのですね。
実験してみたところ、functions.hから#include <string>を取り除いても、コンパイルは通りました。
しかし、さらに実験してみたところ、これが<vector>や<map>の場合ですと、
functions.hに#include <vector>を書いておかないと、コンパイル時にエラーが出てしまうようです。
<string>と<vector>で違いが出る理由はよくわからないのですが、
たとえば<vector>を関数Aで使いたい場合は、どうするのが適切なのでしょうか。
functions.hで#include <vector>をしなければならないのは確定的なようなのですが、
functions.cppやmain.cppにも本当は#include <vector>を書いて、「気持ち悪さ」を拭いたいところです。
No.2
- 回答日時:
う~ん, 「思い込みを変える」という点については #1 に同意するけど, 個人的には方向性は真逆で
使うならとにかく #include しろ
って思う. もちろん「無駄にコンパイルに時間がかかる」のはその通りっちゃその通りだけど, 現実的にどのくらい効いてくるのかなぁ.
あと「#1 へのお礼」については実際のコードを見てみないとなんともいえん. <string> のときと <vector> のときとで, それぞれどんなコードを書いてみたんでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
switch文のエラーについて
-
includeファイルが開けない
-
ヘッダーファイルがインクルー...
-
LinuxのQtに関する質問です。
-
boost::serializationについて
-
#include "fstream.h"
-
C++ iteator const を使ったプ...
-
enumの値から定義名を文字列化...
-
cygwinとUnixのコンパイルの違い。
-
std::lower_boundについて
-
2÷3などの余りについて
-
信頼区間の1.96や1.65ってどこ...
-
2の補数を計算するプログラム
-
マイナスからプラスへ転じた時...
-
Aの値からBの値を除するとは??
-
ある商品のロス率を5%見込み、...
-
反転した数値を表示させるやり方
-
O(n log n)について2
-
C言語 関数プロトタイプ宣言の...
-
配列を使って魔方陣
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
switch文のエラーについて
-
構文エラーが出ているのですが...
-
VC++で文字列から任意の文字を...
-
#defineの使い方について
-
空ENTERの判別
-
C++でShowCursorを使いたい。
-
enumの値から定義名を文字列化...
-
C++での <iostream.h>と<iostre...
-
VS2019でofstreamが未定義になる
-
std::wstringのメモリリークに...
-
wstringの主力
-
JPEGやPNGが読めるLoadImage関数
-
なぜ、C++の標準ヘッダをインク...
-
#include "fstream.h"
-
C言語のエラーを修正したい
-
C言語のポインターで詰まっている
-
#define中の#のエスケープ
-
リモートデスクトップの接続元I...
-
CStringとString
-
【C++】複素数で配列を使いたい
おすすめ情報
stringの場合はfunctions.hに#include <string>は不要なようなのですが、
たとえば関数Aの戻り値や引数にvectorを使いたい場合は、
functions.h内に#include <vector>が必要になるようです。
この場合、functions.cpp(や、あるいはmain.cpp内でvectorを使いたくなった場合)では、
#include "functions.h"をしておけば#include <vector>は必要ないわけですが、
ここで「<vector>を(直接)インクルードしていないのにvectorを多用している、ように見える」状況が発生します。
この「気持ち悪さ」はうまく払拭できるのでしょうか。
あるいは、そういうものだと思って諦めるものなのでしょうか。
すみません、いろいろと勘違いがあったようです。
一旦質問を閉じさせていただきます。お返事いただいた方々、ありがとうございました。