【发布时间】:2020-07-24 08:59:28
【问题描述】:
如果我有一个名为 test.h 的文件并且想要防止双重包含它(以防止链接器错误),我被告知要输入:
#ifndef TEST_H_INCLUDED
#define TEST_H_INCLUDED
但我已经看到了多个版本,例如一个告诉我写:
#ifndef TEST_H
#define TEST_H
有什么区别,为什么我不能像这样简单地使用我的文件的原始名称:
#ifndef test.h
#define test.h
编辑:如果#ifndef 之后的名称不重要并且可以是类似的名称,预处理器如何知道我正在尝试防止双重包含名为test.h 的头文件:@ 987654332@,如果我不打算使用它,那么使用名称还有什么意义呢?他们应该让它更容易,让我们只输入:
#ifndef
#define
【问题讨论】:
-
在您包含的所有标题中定义的所有宏中,该名称必须是唯一的。只要您清除为实现保留的名称,就可以了。这意味着大多数情况下没有前导下划线。使用标头名称作为标头保护的基础是一种合理的算法。如果需要,您可以在某个时候使用文件的 MD5 哈希来生成名称。任何可能唯一的名称都可以。如果证明不是唯一的,您可以更改其中一个名称。
-
如果您不太关心可移植性,可以探索
#pragma once。这更像是你的魔法咒语。
标签: c macros include c-preprocessor c99