我可以 "hide" 在 C++ 的头文件中定义的任何东西吗

Can I "hide" anything defined in a header file in C++

假设我有一个头文件test.h

#pragma once

extern uint64_t a;

void foo( uint64_t );

在我的例子中,uint64_t 用于表示 Bitboard 作为我的国际象棋引擎的一部分
test.h
自然我会到处使用 uint64_t。我想为 uint64_t 创建一个类型别名,如 Bitboard
所以我做了

using uint64_t = Bitboard;

但是由于这是一个头文件,所以现在到处都定义了Bitboard,因为这个头文件几乎被项目的所有其他文件所使用。
问题是我只想在test.h.

中使用这个别名

问题

项目不小,而且Bitboard不是一个非常独特的标识符,我觉得像这样的全局别名可以引起一些冲突,因此我想严格保持在 test.h.

以内

有没有什么方法可以让我仍然在头文件中创建一些东西,而不让它泄漏到我项目的所有其他文件中?

Is there any way I can still use create something in a header file, and not have it leak into all the other files of my project?

没有。包含的文件是完全包含的。如果包含的文件包含某些内容,则将包含该内容。简单的解决方案是不要将您不希望它包含的内容放入 header。


using uint64_t = Bitboard;

But since this is a header file, Bitboard is now defined everywhere

这没有定义 Bitboard。这定义了 uint64_t - 这是为全局命名空间中的语言实现保留的标识符。


The project isn't small, and Bitboard isn't a very unique identifier

除了上面提到的不定义的解决方案外,还有一种解决方法是在命名空间内定义名称,以提高其唯一性。

将其移动到一个新的头文件中,该文件将仅包含在您希望保密的源文件中。

最好你能做的就是使用丑陋的 C #define

#pragma once

#define Bitboard uint64_t

extern Bitboard a;
void foo(Bitboard);

...

#undef Bitboard