18

ちょうどこの中で見た<boost/asio.hpp>

#ifndef BOOST_ASIO_HPP
#define BOOST_ASIO_HPP

#if defined(_MSC_VER) && (_MSC_VER >= 1200)
# pragma once
#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)

/// ....

#endif // BOOST_ASIO_HPP

_MSC_VERプリプロセッサのチェックを無視して#pragma once、この場合の利点は何ですか? プリプロセッサ ヘッダー ガードは、すべての場合、すべてのプラットフォームで、ヘッダーの内容が一度だけであることを保証しませんincludedか?

4

5 に答える 5

21

#pragma onceソース コード ファイルをコンパイルするときに、ファイルがコンパイラによって1 回だけインクルードされる (開かれる) ことを指定します。#includeこれにより、コンパイラは最初のモジュールの後にファイルを開いて読み取らないため、ビルド時間を短縮できます。

そうしない#pragma onceと、ファイルが必要になるたびにファイルが開か#ifndef BOOST_ASIO_HPPれ、定義されている場合、コンパイラはファイルの解析を停止します。

于 2010-08-13T10:02:34.743 に答える
0

#pragma once同じ目的を持っていますが、インクルード ガードは、ファイルが 1 回だけインクルードされるようにするために、より深い分析を要求することを目的としています。

// somerandomfileinmyproject.cpp
#undef BOOST_ASIO_HPP 
#include <bost/asio.cpp>

コンパイラがそのようなケースを正しく処理しない限り、以前に含まれていたとしても、ファイルを開いてプリプロセッサに渡す必要があります。

于 2010-08-13T10:16:04.890 に答える
0

はい、ヘッダー ガードにより、ヘッダーの内容が 1 回だけ含まれるようになります。しかし、ここでは #pragma を使用して別の定義をチェックしており、ファイルをインクルードしていません。

以下のリンクは、SO のヘッダー ガードに関する既存の質問です。

ヘッダー ガードの目的

于 2010-08-13T09:59:25.280 に答える
0

#pragma once以下を使用して、標準的な方法での効果を再現できます。

#if !defined GUARD_SYMBOL
#include "GUARDED_FILE"
#endif

ただし、はるかに冗長です。他の人が言ったように、ファイルを開いてその中のすべてを無視する代わりに、ファイルが検索/開かれないため、コンパイル時間に役立ちます-ファイルはまだプリプロセッサによって解析される必要があります。

于 2010-08-13T10:23:14.253 に答える