38

LearnCpp.com | 1.10 — プリプロセッサの初見Header Guardsの下に、次のコード スニペットがあります。

add.h:

#include "mymath.h"
int add(int x, int y);

減算.h:

#include "mymath.h"
int subtract(int x, int y);

main.cpp:

#include "add.h"
#include "subtract.h"

ヘッダーガードの実装では、次のように言及されています。

#ifndef ADD_H
#define ADD_H

// your declarations here

#endif
  • ここでの宣言は何でしょうか?そして、int main()後に来るはず#endifですか?
  • 慣習を追加_Hすることですか、それともやらなければならないことですか?

ありがとう。

4

5 に答える 5

68

FILENAME_Hコンベンションです。本当に必要な場合は#ifndef FLUFFY_KITTENS、ヘッダー ガードとして使用できます (他の場所で定義されていない場合)。

ヘッダー ファイル add.h では、宣言は文字どおり と の間#ifndefにあり#endifます。

#ifndef ADD_H
#define ADD_H

#include "mymath.h"
int add(int x, int y);

#endif

最後にint main()、ヘッダー ファイルに含めるべきではありません。常に.cppファイルにある必要があります。

それをクリアするには:

#ifndef ADD_H#defined基本的には、「ファイルまたはインクルード ファイルにADD_H が含まれていない場合は、#ifndef#endifディレクティブの間のコードをコンパイルする」ことを意味します。#include "add.h"そのため、ファイル内で複数回試行すると.cpp、コンパイラは ADD_H が既に何であるかを確認し、と#definedの間のコードを無視します。ヘッダー ガードは、ヘッダー ファイルが同じファイルに複数回含まれるのを防ぐだけです。ヘッダー ガードは、他のファイルがヘッダー ファイルをインクルードすることを妨げません。ただし、保護されたヘッダー ファイルをすべてのファイルに含めることができるのは1 回だけです。#ifndef#endif.cpp.cpp.cpp

于 2011-01-22T09:26:11.023 に答える
19
  • 1 つの実装 (「.cpp」) ファイルを前処理した結果が翻訳単位 (TU) です。

  • ヘッダーには他のヘッダーを含めることができるため、同じ TU 内にヘッダーが間接的に複数回含まれる場合があります。(あなたの mymath.h はこの例です。)

  • 定義は、TU ごとに最大 1 回しか発生しません。(一部の定義は、複数の TU 内にあってはなりません。このケースは少し異なり、ここでは説明しません。)

  • インクルード ガードが解決する問題は、特定のヘッダーが 1 つの TU 内に複数回含まれている場合の複数の定義エラーを防止することです。

  • インクルード ガードは、2 番目以降のインクルードがノーオペレーションになるように、ヘッダーの内容を「ラップ」することによって機能します。#ifndef/#define ディレクティブはファイルの最初の 2 行であり、#endif は最後である必要があります。

  • インクルード ガードはヘッダーでのみ使用されます。メイン関数をヘッダーで定義しないでください。実装ファイルに入れます。

型を定義して関数を宣言するヘッダーがあるが、ヘッダー自体も必要な場合:

#include "other_header.h"

struct Example {};

void f();

インクルードガードで「ラップ」すると、ファイルの完全な内容が得られます。

#ifndef UNIQUE_NAME_HERE
#define UNIQUE_NAME_HERE

#include "other_header.h"

struct Example {};

void f();

#endif

インクルード ガードに使用する名前は一意である必要があります。そうしないと、競合する名前が紛らわしい結果をもたらします。これらの名前は単純なマクロにすぎず、言語には特定のスタイルを強制するものは何もありません。ただし、通常、プロジェクトの規約によって要件が課されます。ここSOや他の場所で見つけることができるいくつかの異なるインクルードガード命名スタイルがあります。この回答は、適切な基準と適切な概要を提供します。

于 2011-01-22T10:25:07.353 に答える
3

ヘッダー ガードが行うことは、ヘッダーのインクルードを 1 回だけ許可することだけです。(複数回含まれている場合は無視されます。)

使用する名前は問題ではありませんが、デモのように拡張子を含めてファイル名を大文字で使用するのが一般的です。

あなたmainは本当に.cppファイルにあるはずですが、ヘッダーに入れる場合は、ガードの中に入れて、複数回宣言されないようにしてください。

于 2011-01-22T09:21:08.687 に答える
1

いいえ、int main() は .cpp に入ります。宣言は、ヘッダーに入れる予定の他のものです。_Hは規則であり、さまざまなヘッダー ガード規則が見られます。

于 2011-01-22T09:20:30.133 に答える
1

ヘッダーファイルと定義で宣言を宣言するかint main()、ファイルに入っていsource.cppます。

_H誰かがインクルード ガードを使用してヘッダー ファイルをインクルードしようとしていることを示すためだけに存在します。

MSVC ++を使用している場合は、使用することもできます#pragma once

于 2011-01-22T09:38:43.523 に答える