如何包含名称中包含">"的头文件?

How can I include a header file that contains `>` in its name?

本文关键字:文件 gt 包含 何包含      更新时间:2023-10-16

我承认这是一个相当人为的问题,但事实就是如此。

假设您有一个名称中包含>字符的文件。这在大多数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"