QA@IT

Qt/C++で#includeするときの<>と""の使い分け

6996 PV

C++初学者です。お世話になります。

C++の#includeでは、$PATH内で検索できるライブラリでは<>を使い、作業ディレクトリから相対パスで参照するときは""を使うということを理解しましたが、この原則がQtで当てはまらないように感じたので質問させていただきます。

qmake用の.proファイルで

QT += websockets

と指定したときに、C++のソースでは

#include <QtCore/QDebug>
#include "QtWebSockets/QWebSocket"

と指定するようです。
※参照:公式チュートリアル
http://qt-project.org/doc/qt-5/qtwebsockets-simplechat-example.html
http://qt-project.org/doc/qt-5/qtwebsockets-simplechat-simplechat-pro.html
http://qt-project.org/doc/qt-5/qtwebsockets-simplechat-chatserver-cpp.html

QWebSocket$PATH内にあるライブラリですので<QtWebSockets/QWebSocket>と指定するのが自然なように感じるのですが、クオーテーションで指定するのには何か理由があるのでしょうか。ご教示ください。

よろしくお願いいたします。

回答

うーん、真意はわかりかねますが、

http://doc.qt.io/qt-5/qtwebsockets-index.html
ではしっかり#include <QtWebSockets/QtWebSockets>と書いてありますし、

テストコードらしき
https://qt.gitorious.org/qt/qtwebsockets/source/89dcdaeedf0e42e99ccc1d44183e1fbaccc40bb1:tests/auto/qwebsocket/tst_qwebsocket.cpp

#include <QtWebSockets/QWebSocket> ですので <>で良いかと思います。

サンプル内でも

Echo server cpp ( http://doc.qt.io/qt-5/qtwebsockets-echoserver-echoserver-cpp.html )

#include "QtWebSockets/qwebsocketserver.h" ですが、

Echo client h ( http://doc.qt.io/qt-5/qtwebsockets-echoclient-echoclient-h.html ) は、#include <QtWebSockets/QWebSocket> ですので、

サンプルコードの作者によるのかもしれません。

開発者の環境であれば PATH環境変数にあるライブラリのバージョンは安定バージョンで、相対パスにはunstableな最新バージョンがあるという環境も考えられますのでそういうのが影響しているかもしれませんね。

編集 履歴 (0)
  • ありがとうございます。別のサンプルを見るという考えがありませんでしたので、実例を拝見してとても納得しました。 -

Qt/C++ とかの実装は分かりませんが・・・

プログラミング言語 C 第 2 版の「参照マニュアル」の A12.4 に書いてあったことですが、違いは:

(1) #include <filename> の場合、ファイルは処理系に依存する一連の場所の中で探される。

(2) #include "filename" の場合、元のソースファイルとの関連でまず検索が行われ、見つからないと (1) の形式が仮定されて検索が行われる。また、(1) と違って、filename の中の文字に '>' は許される。

ということだそうです。

ただし、The C++ Programming Language Second Edition では、上記 (2) の「元のソースファイルとの関連で」というところが違っていて、(1) と同じ(英文では "an implementation-dependent sequence of places")と書いてありました。

ご参考まで。

編集 履歴 (0)
  • ありがとうございます。"implementation-dependent sequence"とはおそらくコンパイラが探索する順序を規定するのでしょうね。一般的なコンパイラでは、ご教示頂いた(1)(2)のsequenceに従うということなのですね。とても勉強になりました。ありがとうございます -
ウォッチ

この質問への回答やコメントをメールでお知らせします。