c – 保护某些包含位置

我正在构建一个将编译为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中做同样的事情,但我担心用户可能(假设)做一个相对路径包含并导致冲突.

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

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

此外,如果该文件夹中有一个名为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 guard.然后,无论使用何种路径,随后手动包含它们都不会产生任何影响.

当然,这不会阻止任何人手动#undefing你的后卫,创造一些混乱.然而,C从来没有因为可靠地防止你在脚下射击自己而声名远扬,并且在可预见的未来不太可能获得这种声誉;所以呢?实际上,大多数编译器都实现了#pragma一次,这可能是一种稍微好一点的脚部自我预防方法……

转载注明原文:c – 保护某些包含位置 - 代码日志