首页 > 解决方案 > 如何包含名称中包含`>`的头文件?

问题描述

我承认,这是一个相当人为的问题,但就是这样。

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

Clang给我以下错误:

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

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

那么,在 C 和/或 C++ 中,有没有办法包含一个>名称中包含该字符的头文件?

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

标签: c++cc-preprocessorlanguage-lawyer

解决方案


那么,在 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 )),但它的效果是实现定义的,我尝试过的实现不允许将weirdand加入>name单个预处理器令牌中,然后可以将其包含在内


推荐阅读