保护某些包含位置

Protecting certain include locations

我正在构建一种可以编译为 C 或 C++ 的小语言,我还没有决定,但是我遇到了一个关于 #include 关键字的难题。

我的语言将带有一个标准库,该库将被合并到该语言中,并且可以像 C 或 C++ 一样使用标准库进行访问,例如 #include <string>

我的编译器可以自动区分用户包含和标准库包含,但我的问题在于GCC编译器如何使用-I 标志。

我们以Java为例。默认包(文件夹)之一称为 java.util。如果我尝试在我的项目中创建自己的名为 java.util 的文件夹,我会收到错误消息:

The package java.util conflicts with a package accessible from another module: java.base

意味着默认包含它。

我希望它在 C++ 中做同样的事情,但我担心用户可能(假设地)做一个相对路径包含并导致冲突。

举个例子,我是这样使用flag的:-I ../some/folder.

然而,用户只需键入 #include "../some/folder" 即可访问相同的内容。有什么办法可以限制这个,就像问题的标题所暗示的那样,"protect" 文件夹不会被这样调用?

此外,如果该文件夹中有一个名为 test.h 的文件,并且用户决定在本地创建自己的名为 test.h 的文件并将其包含在内。冲突将如何发生?它会在包含的 via 上选择本地文件夹吗?旗帜?

基本实现示例如下:(通用语法,无特定语言)

boolean userDefine = false;
string defineName = "foo";

// Do something to determine if <> define or "" define.

if (userDefine) {
    // Returns #include "foo"
    return "#include \"" + defineName + "\"";
} else {
    // Returns #include "stdlib/foo"
    return "#include \"stdlib/" + defineName + "\"";
}

但话又说回来,用户可以包含该文件夹,使其满足第一个条件并仍然获得访问权限。

将任何 #include 文件放在 C++ 源文件的开头几乎是标准做法,这是首要任务。

当然,#include 可以出现在 C++ 源文件中的任何位置,并且在某些情况下会发生这种情况,但是,如果您要从 github 中获取一些随机的 C++ 源代码,很有可能非常好,所有 #include 文件都将位于文件的开头。

因此,您所要做的就是安排您的库的 #include 始终位于开头,并在您的头文件中使用标准的 #ifndef/#define 守卫。然后,无论使用什么路径,随后手动包含它们都没有任何效果。

当然,这不会阻止任何人手动#undef攻击你的守卫,制造一些混乱。然而,C++ 从来没有可靠地防止你搬起石头砸自己的脚的名声,而且在可预见的未来也不太可能赢得这样的名声;所以呢?实际上,大多数编译器都实现了#pragma once,这可能是一种稍微好一点的脚部自拍预防方法......