如何包含名称中包含">"的头文件?
How can I include a header file that contains `>` in its name?
我承认这是一个相当人为的问题,但事实就是如此。
假设您有一个名称中包含>
字符的文件。这在大多数Unix系统上都是可能的:
$ touch 'weird>name'
$ ls -l
-rw-r--r-- 1 user user 0 28 Mag 11:05 weird>name
现在,假设此文件包含 C/C++ 代码,并且您希望将其作为标头包含:
#include <weird>name>
int main() {
return weird_function();
}
Clang给了我以下错误:
test.cpp:1:10: fatal error: 'weird' file not found
#include <weird>name>
当然,由于预处理器将指令解析到第一个>
并查找weird
文件。但是,我想知道是否存在一些转义机制来允许我包含正确的文件。
那么,在 C 和/或 C++ 中,有没有办法包含名称中包含>
字符的头文件?
编辑:许多人建议我为什么不使用#include "weird>name"
。我承认在写问题时我的思想滑过了引号语法,但它仍然有效,因为这两种语法可能会要求编译器在不同的路径中搜索(至少在理论上)。那么是否有任何转义机制让我使用#include <>
语法包含weird>name
?
那么,在 C 和/或 C++ 中,有没有办法包含名称中包含> 字符的头文件?
是的:
#include "weird>name"
那么是否有任何转义机制让我使用
#include <>
语法包含weird>name
?
不。<
和>
之间的字符必须是"源字符集的任何成员,换行符和>
除外"([lex.header])。任何转义的编辑:允许实现支持实现定义的转义序列(参见[lex.header] p2及其脚注)。>
形式仍然是表示>
字符的一种方式,这是不允许的。
#include " q-char-sequence "
表单确实允许显示>
字符,即使如果搜索失败,它可能会被重新处理为#include <...>
"..."
([cpp.include] p3)。
预处理器还允许另一种形式([cpp.include] p4](http://eel.is/c++draft/cpp.include#4)),但它的效果是实现定义的,我尝试的实现不允许将weird
和>
和name
连接到一个可以包含的预处理器令牌中
询问编译器的作者。
C 和 C++ 标准为#include
指令的解释提供了很大的实现余地。没有要求#include <foo.h>
导致包含名为"foo.h"的文件。例如,编译器可以选择 ROT13 所有源文件名(如果它愿意)。对于非字母数字字符,实现可以识别和重新映射某些字符序列。因此,如果有一个平台>
经常出现在文件名中,那么该平台的编译器很可能会指定,例如,g
或其他东西将被重新映射到>
。但该标准并不强制要求特定的编码。
顺便说一下,实现也可以选择允许#include <weird>name>
。由于在语言标准下它不是很好的格式,因此实现可以自由地将其含义定义为扩展。
尝试以下语法:
#include "weird>name"
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 文本文件中的单词链表
- CMake-按正确顺序将项目与C运行时对象文件链接
- 使用新行和不使用新行读取文件
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 挂起和取消挂起一个文件DLL
- 如何确定我已使用非编码文件到达 EOF?
- 命名空间中具有.h和.cpp文件的类
- 如何使用ndk-build.cmd构建Android.so文件
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 读取文件并输入到矢量中
- 在C++中查找文件
- c++库的公共头文件中应该包含什么
- 用c++从输入文件中读取另一行
- Cppcheck生成xml转储文件
- 读取文件的最后一行并输入到链接列表时出错
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- 如何将内容数组写入文本文件?
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到