1

Cでは、ファイルを次のように含めることができます。#include "filename.h"
ただし、たとえば、filename.hの内容が-の場合

#ifndef FILE_NAME_GUARD

#define FILE_NAME_GUARD

//contents
.
.
.

別のファイルに、#include <FILE_NAME_GUARD>代わりに上記のファイルを含めることはできます#include "filename.h"か?

この方法を試してみましたが、コンパイラエラーやリンカエラーがないことに驚きました。しかし、この警告がありました:

FILE_NAME_GUARD: No such file or directory

multiple_header_guardファイル名の代わりに名前のヘッダーを含めることができるかどうかを明確にするのに役立ちますか?

4

4 に答える 4

1

いいえ - ガード マクロに使用する名前がファイル名と正確に一致しない限り、そうではありません。たとえば、次のようなファイルを含めることができます。

#define filename <stdio.h>
#include filename

filenameマクロ置換されるため、結果は次のようになります。

#include <stdio.h>

したがって、インクルードするファイルの名前 (引用符または山かっこを含む) と正確に一致するヘッダー ガード マクロを使用した場合、それを機能させることができますが、それ以外の場合は失敗します。このようにコードを書くのは良い考えではないと思います。ほとんどの場合、まったく意味がないように思われます。ヘッダー ガード マクロは、そのヘッダーが既にインクルードされている場合にのみ定義されます。これは、(通常は) インクルードしたくない場合とまったく同じです。

于 2012-11-27T06:16:36.097 に答える
0

ヘッダーガードマクロでファイルを実際に含めることはできません。通常、ヘッダーガードマクロは空の文字列として定義されており、空の文字列で名前が付けられたファイルを含めることは困難です。

あなたは書ける:

#define MAGIC_HEADER "magic.h"
#include MAGIC_HEADER

ここで、後に使用されるマクロ#includeは、フォーム"name"または。のいずれかに一致し<name>ます。ただし、ヘッダーガードでそれを試してみても意味がありません。ヘッダーガードマクロが定義されるまでに、ファイルは既にインクルードされており、再度インクルードする必要はありません(<assert.h>NDEBUGマクロかどうかに応じて、毎回異なる効果で複数回インクルードできるうなずきがあります)。定義されているかどうか)。

于 2012-11-27T06:21:30.390 に答える
0

実際には、インクルード ステートメント内の<>orの間で行われること""は、ほとんど完全に実装定義であるため、確実に言うことはできません。

技術的には、どのインクルード ファイルがどのガード名にマップされているかを実装で記憶し、それをインテリジェントに処理できますが、私は実際にそれを見たことがありません。

また、警告メッセージから判断すると、実装もそれを行いません。

于 2012-11-27T06:15:55.077 に答える
0

ファイル名の代わりにその multiple_header_guard 名を持つ a ヘッダーを含めることができるかどうかを明確にするのを手伝ってください??

いいえ、できません。プリプロセッサは魔法ではないからです。

于 2012-11-27T06:17:34.507 に答える