私は C++ でインクルード ガードを研究していて、ウィキペディアからこの命名規則に出くわしました。
CREATORSNAME_YYYYMMDD_HHMMSS
タイムスタンプであることがわかりましたが、次のように言います
#ifndef CREATORSNAME_YYYYMMDD_HHMMSS
#define CREATORSNAME_YYYYMMDD_HHMMSS
#endif
それでは、コンパイラはそれが HeaderName.h であることをどのように認識しますか?
私は C++ でインクルード ガードを研究していて、ウィキペディアからこの命名規則に出くわしました。
CREATORSNAME_YYYYMMDD_HHMMSS
タイムスタンプであることがわかりましたが、次のように言います
#ifndef CREATORSNAME_YYYYMMDD_HHMMSS
#define CREATORSNAME_YYYYMMDD_HHMMSS
#endif
それでは、コンパイラはそれが HeaderName.h であることをどのように認識しますか?
これは、モジュールを作成した人物とその時期に関するドキュメントを保存する便利な方法であり、(日付を通じて) ガードの一意性を保証し、モジュールを参照する他のユーザーに追加情報を提供します。特に、対応する実装に問題があると思われる場合は、誰かに連絡してください。そうしないと、モジュールの作成者が、自分が誰であるかについてのドキュメントを追加するのを忘れる可能性があります。
#ifndef CHRIS_20140807_011555
#define CHRIS_20140807_011555
struct foo {
int member;
};
#endif /* CHRIS_20140807_011555 */
または、これを行うこともできますが、追加情報は提供されず、ドキュメントを一番上に追加することは忘れがちです (正直なところ、習慣になるはずであり、忘れるべきではありません)。ただし、以下のオプションがはるかに広く使用されているにもかかわらず、これがそのようなプラクティスの動機である可能性があります。
/*
* AUTHOR: Chris
* DATE: July 7, 2013
*
* These comments are easy to forget
*/
#ifndef FILENAME_H
#define FILENAME_H
struct foo {
int member;
};
#endif /* FILENAME_H */
これ:
#ifndef AAAA
#define AAAA
struct foo {
int member;
};
#endif
と
#pragma once
struct foo {
int member;
};
これらのコード スニペットはすべて、まったく同じことを実現します。
2013 年 1 月 1 日午後 12 時に John Doe によって作成された MyFile.h というファイルの場合、次のように使用します。
#ifndef JOHNDOE_20130101_120000
#define JOHNDOE_20130101_120000
// File contents
#endif
ファイルの名前をインクルードガードに配置したくない理由は私にはわかりません。