【发布时间】:2016-11-10 23:24:34
【问题描述】:
对于文件名啊.h...我一直用
#ifndef A_H
#define A_H
#endif
但现在我在教程中看到了
#ifndef __A_H_INCLUDED__
#define __A_H_INCLUDED__
#endif
还有
#ifndef _A_H_INCLUDED
#define _A_H_INCLUDED
#endif
所以我想知道发生了什么事...这在 C++ 从未有过的版本中发生了变化,还是这个编译器依赖于这个编译器?
我使用 MinGw (gnu gcc g++) 和 msvc...
编辑:
如果对为什么要问这个问题感到困惑,我相信这对新手来说是相当困惑的。例如,对于名为 a.h 的文件,我们不会说
#ifndef a.h
#define a.h
甚至
#ifndef A_H
#define A_H a.h
这对我来说很有意义。
相反,我们说 A_H... 或上述变体之一。因此,我认为不仅仅是任何语法都可以。我一直认为它必须是大写的文件名,并且必须用_替换句点。这就是我多年来看到它被教导的方式。不,我看到像 _INCLUDED 之类的词......这显然不是 a.h 文件名的一部分......这令人困惑......编译器如何协调 A_H_INCLUDED 指的是 a.h?我不明白为什么这被否决了,我认为这很令人困惑。
另外,有人说其中一些变体不符合标准,因此我认为这是一个有效的问题,不应该被否决。
还是#define A_H 将所有代码从头文件转储到A_H 宏中?但我认为定义以换行符结束......在这种情况下,我们定义 A_H 没有值。在这种情况下, A_H 只是一个没有值的名称,问题仍然是当您使用像 A_H_DINGDONG 这样的时髦空 marco 变量时,编译器如何知道您正在谈论文件 a.h ?
【问题讨论】:
-
你在说什么?宏名称一直是完全任意的。选择你喜欢的任何东西。除了名称之外,我认为这三个变体之间没有区别。但是,我建议不要使用以
__或_+大写字母开头的名称 - 这些都是保留的。 -
避免以下划线开头可能会干扰系统库
-
你可以使用任何你喜欢的marco定义。还有#pragma once,它不是标准的,但几乎所有 C/C++ 编译器都支持。
-
例如,如果您的宏:
__WIN32那么您将面临冲突
标签: c++ c++11 c-preprocessor c++14