保护某些位置包括 我正在构建一种编译成C语言或C++语言的小语言,但我还没有决定,但是我遇到了一个关于的问题,其中包括Time/< 我的语言将带有一个标准的库,它将被纳入语言,并且可以像C或C++那样访问,标准包括:包含

保护某些位置包括 我正在构建一种编译成C语言或C++语言的小语言,但我还没有决定,但是我遇到了一个关于的问题,其中包括Time/< 我的语言将带有一个标准的库,它将被纳入语言,并且可以像C或C++那样访问,标准包括:包含 ,c++,c,gcc,include,include-path,C++,C,Gcc,Include,Include Path,我的编译器可以自动区分用户包含和标准库包含之间的区别,但我的问题在于GCC编译器如何使用-I标志 让我们以Java为例。其中一个默认包(文件夹)称为java.util。如果我试图在项目中创建自己的名为java.util的文件夹,则会出现以下错误: 包java.util与可从另一个模块java.base访问的包冲突 这意味着默认情况下包含它 我希望在C++中做同样的事情,但是我担心用户可以(假设地)执行一个相对路径,并引起冲突。 例如,我使用这样的标志:-I../some/folder 但是,用户

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

让我们以Java为例。其中一个默认包(文件夹)称为
java.util
。如果我试图在项目中创建自己的名为
java.util
的文件夹,则会出现以下错误:

包java.util与可从另一个模块java.base访问的包冲突

这意味着默认情况下包含它

我希望在C++中做同样的事情,但是我担心用户可以(假设地)执行一个相对路径,并引起冲突。 例如,我使用这样的标志:

-I../some/folder

但是,用户只需键入
#include“./some/folder”
即可访问相同的内容。我有没有办法限制这个,就像问题的标题所暗示的那样,“保护”文件夹不被这样称呼

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

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

boolean userDefine=false;
字符串defineName=“foo”;
//做一些事情来确定是定义还是“定义”。
if(userDefine){
//返回#包括“foo”
返回“#include\”+defineName+“\”;
}否则{
//返回#包括“stdlib/foo”
返回“#include\”stdlib/“+defineName+”\”;
}

但是,用户可以将文件夹包含在第一个条件下,仍然可以访问。

< P>这是将任何<代码>包含在C++源文件的开头的文件作为第一个业务的标准实践。 <>当然,<>代码>包含< /C> >可以出现在C++源文件的任何地方,并且当出现这种情况时,如果你从GITHUB抓取一些随机C++源,那么所有的<代码> >包含文件将很可能在文件的开头。 因此,您所要做的就是安排库的
#include
始终在开头,并在头文件中使用标准的
#ifndef/#define
保护。然后,无论使用什么路径,随后手动包含它们都不会产生任何效果


当然,这不会阻止任何人手动取消你的防护,从而造成混乱。然而,C++从来没有可靠地防止你在野外射击的名声,而且在可预见的将来不可能赢得这个名声;那又怎么样?实际上,大多数编译器实现了
#pragma once
,这可能是一种更好的防止脚部自伤的方法…

如果您使用stock、standard variety、ifndef/define guards,并且如果您的头总是包含在每个robo生成的代码中,那么有人可以粘贴数百个明确的头,无论如何,这不会有任何区别。@SamVarshavchik啊!所以你说,如果我在任何用户包含之前生成并包含它们,它们将永远是mo哦,天哪,这太棒了。@SamVarshavchik我会在接受任何问题之前24小时开放我的问题,以吸引答案,但请,我希望你能把你的评论变成一个答案,因为我相信你可能已经解决了我的问题。事实上,我不知道有一个
#undef
存在,但幸运的是,因为它是一种新语言,所以我不能包含该功能但是,C++从来没有一个名声,它能可靠地防止你在脚上射中自己。“不,脚射击是C++的。”
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 + "\"";
}