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

gig*_*tes 15 c c++ language-lawyer c-preprocessor

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

假设您有一个>名称中包含字符的文件。这在大多数Unix系统afaik上都是可能的:

$ touch 'weird>name'
$ ls -l
-rw-r--r--  1 user  user   0 28 Mag 11:05 weird>name
Run Code Online (Sandbox Code Playgroud)

现在,假设此文件包含C / C ++代码,并且您希望将其作为标头包括在内:

#include <weird>name>

int main() {
  return weird_function();
}
Run Code Online (Sandbox Code Playgroud)

lang给我以下错误:

test.cpp:1:10: fatal error: 'weird' file not found
#include <weird>name>
Run Code Online (Sandbox Code Playgroud)

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

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

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

Jon*_*ely 19

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

是:

#include "weird>name"
Run Code Online (Sandbox Code Playgroud)

那么,是否有任何转义机制让我包括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>name进入一个可以包含在内的单个预处理器令牌

  • 下一步:如何包含名称中包含“”的头文件? (23认同)
  • 我承认我的想法不合乎“文件”语法,但问题仍然有效,即使有点有趣,因为“ &lt;&gt;”和“””可能会在不同的路径中搜索 (2认同)
  • 我不确定第二部分是否正确。任何转义`&gt;`的尝试实际上都不是`&gt;`字符。就是说,不需要预处理器识别其中的任何转义序列。 (2认同)

Sne*_*tel 7

询问编译器的作者。

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

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