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

时间:2019-05-28 09:15:10

标签: c++ c c-preprocessor language-lawyer

我承认,这是一个人为的问题,但这是事实。

假设您有一个名称中带有>字符的文件。在大多数Unix系统 afaik

上都是可行的:
$ 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();
}

C语给我以下错误:

test.cpp:1:10: fatal error: 'weird' file not found
#include <weird>name>

当然,由于预处理程序会解析指令直至第一个>并查找weird文件。但是,我想知道是否存在某种转义机制来允许我包含正确的文件。

因此,在C和/或C ++中,是否可以包含名称中带有>字符的头文件?

编辑:许多人建议我为什么不使用#include "weird>name"。我承认在编写问题时我的主意是忽略引号语法,但是它仍然有效,因为这两种语法可能会要求编译器在不同的路径中搜索(至少在理论上是这样)。那么,有没有让我使用weird>name语法包含#include <>的转义机制?

3 个答案:

答案 0 :(得分:18)

  

因此,在C和/或C ++中,是否可以包含名称中带有>字符的头文件?

是:

#include "weird>name"
  

那么有没有任何一种转义机制可以让我使用weird>name语法包含#include <>

不。 <>之间的字符必须是“源字符集的任何成员,除了换行符和>之外的所有字符”([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和{ {1}}和>放入一个可以包含的预处理器令牌中

答案 1 :(得分:7)

询问编译器的作者。

C和C ++标准为实现#include指令提供了很大的回旋余地。不需要#include <foo.h>导致包含名为“ foo.h”的文件。例如,如果愿意,编译器可以选择将所有源文件名ROT13。对于非字母数字字符,该实现可以识别并重新映射某些字符序列。因此,如果存在一个平台,其中>经常以文件名显示,则该平台的编译器可能会指定\g或将某些内容重新映射到>。但是该标准没有强制要求特定的编码。

顺便说一句,该实现可能只是选择允许#include <weird>name>。由于这在语言标准下格式不正确,因此实现可以自由定义其含义作为扩展。

答案 2 :(得分:1)

尝试以下语法:

#include "weird>name"