3

以前は次のコードを使用して、インクルード ファイルが複数回読み込まれないようにしていました。

#ifndef _STRING_
#include <string>
#endif

// use std::string here
std::string str;
...

このトリックは、書籍「API Design for C++」で説明されています。

私の同僚は、Visual Studio ではこれは必要ないと言っていました。文字列の実装ヘッド ファイルに が含まれている場合#pragma once、コンパイル速度を向上させるためにインクルード ガードは必要ないからです。

あれは正しいですか?

元の本からの引用:

7.2.3 Redundant #include Guards
Another way to reduce the overhead of parsing too many include files is to add redundant preprocessor
guards at the point of inclusion. For example, if you have an include file, bigfile.h, that looks
like this
#ifndef BIGFILE_H
#define BIGFILE_H
// lots and lots of code
#endif
then you might include this file from another header by doing the following:
#ifndef BIGFILE_H
#include "bigfile.h"
#endif
This saves the cost of pointlessly opening and parsing the entire include file if you’ve already
included it.
4

5 に答える 5

5

通常、「インクルードガード」という用語は、この#ifdefシーケンスがこのファイル#define#endif特定のヘッダーファイルの内容の周りに配置されることを意味します。

多くのC++コンパイラは、#pragma once外部で同じ動作を保証するステートメントを提供します。しかし、移植可能なC /C++コードのためにそれを使用することはお勧めしません。

UPDATE(OPの編集による)さらに、ステートメントを別のファイルの周りに
置くと#ifdef、プリプロセッサがインクルードファイル自体を開くことができなくなる可能性があります(したがって、コンパイル時間とメモリ使用量がわずかに減少します)。これは自動的に行われると思いますが、確実にはわかりません(これは実装固有の可能性があります)。#endif#include#pragma once

于 2013-02-27T18:20:32.253 に答える
2

有能な開発者によって作成されたヘッダー ファイルには独自のガードがあるため、これを行う必要はありません標準ライブラリのヘッダーは有能なエンジニアによって作成されたものであると想定できます。また、インクルード ガードのないサード パーティのヘッダーを使用していることに気付いた場合、そのサード パーティは非常に疑わしいものです...

独自のヘッダーを作成する場合は、次の標準を使用できます。

#ifndef MY_HEADER_H
#define MY_HEADER_H

// ...code

#endif

または、次を使用します。

#pragma once

これは標準の C または C++ ではなく、コンパイラの拡張機能であることに注意してください。すべてのコンパイラで機能するわけではありませんが、それを使用するかどうかはあなたの決定であり、予想される用途によって異なります。

于 2013-02-27T18:15:41.103 に答える
0

これ#pragma onceはインクルード ガードのより優れた形式です。使用する場合は、ベースのインクルード ガードは必要ありません#define

一般に、名前の競合によってインクルード ガードが破られないようにするため、これはより優れたアプローチです。

そうは言っても、インクルードガードは、インクルードをラップするのではなく、ヘッダーファイルにある必要があります。インクルードをラップすることは完全に不要であるべきです (そして、後で他の人を混乱させる可能性があります)。


編集:

私たちは2つの異なることについて話していると思います。私の質問は、#pragma once または #ifndef xxx のいずれかを持つ既存の head ファイルを使用するときに、インクルード ガードを使用する必要があるかどうかです。

その場合、いいえ。ヘッダーに適切なガードがある場合、それを含めないようにする理由はありません。これは、混乱と複雑さを増すだけです。

于 2013-02-27T18:15:30.820 に答える
0

これは、インクルード ガードの使用方法ではありません。#includeインクルード ガードで s をラップしません。ヘッダー ファイルは、インクルード ガードで独自のコンテンツをラップする必要があります。他のファイルに含まれる可能性が高いファイルを作成するときはいつでも、次のことを行う必要があります。

#ifndef _SOME_GUARD_
#define _SOME_GUARD_

// Content here

#endif

C++ ライブラリの Visual Studio の実装では、これは、ヘッダーstringに.#pragma once#ifndef _STRING_

于 2013-02-27T18:15:57.687 に答える