保护某些包含位置
Protecting certain include locations
我正在构建一种可以编译为C或C++的小语言,我还没有决定,但是我遇到了关于#include
关键字的困境。
我的语言将附带一个标准库,该库将被合并到语言中,并且可以像 C 或 C++ 一样访问标准包含,例如#include <string>
.
我的编译器可以自动区分用户包含和标准库包含,但我的问题在于 GCC 编译器如何使用-I
标志。
让我们以Java为例。其中一个默认包(文件夹)称为java.util
。如果我尝试在我的项目中创建自己的名为java.util
的文件夹,则会收到以下错误:
软件包java.util与可从另一个模块访问的软件包冲突:java.base
这意味着默认情况下包含它。
我希望这在C++中做同样的事情,但我担心用户可能(假设)执行相对路径包含并导致冲突。
举个例子,我像这样使用标志:-I ../some/folder
。
但是,用户只需键入#include "../some/folder"
即可访问相同的内容。有什么方法可以限制这一点,并且像问题的标题所暗示的那样,"保护">文件夹不被这样调用?
此外,如果该文件夹中有一个名为test.h
的文件,并且用户决定在本地创建自己的名为test.h
的文件并将其包含在内。冲突将如何发生?它会在包含的通孔上选择本地文件夹吗?标志?
基本实现的示例如下:(通用语法,无特定语言)
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
,这可能是一种稍微好一点的脚自拍预防方法......
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 将值指定给向量(2D)的向量中的某个位置
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 编译包含字符串的代码时遇到问题
- c++库的公共头文件中应该包含什么
- 计算在同一位置至少包含一个常用字符的不同字符串对
- 如何查找 winsock.h 在 Visual Studio 中的包含位置
- 是否可以将要"ShellExecute"的文件包含在 dll 中?如果是这样,"ShellExecute"中的文件位置应该是什么?
- C++将包含的库 (ref DLL) 从根目录更改为另一个位置
- 在 Visual Studio 2010(及更高版本)中定义包含或链接路径变量的位置
- 保护某些包含位置
- 包含具有无效位置的节点引用的方式
- C++项目 - 包含 SQL 类文件的位置
- 无法包含来自不同位置的 jpegLib.h
- 制作包含地图或场景信息的文件,例如要加载的资源、对象、位置、事件
- 如何输出包含的结构位置的集合
- 为什么同一个内存位置同时包含不同的值
- 查找包含在MSVC中的c++名称空间的位置
- 如何查找包含标头的位置
- vs2015 上的 stl 列表性能不佳,同时删除包含迭代器到自身在列表中的位置的节点