我承认,这是一个人为的问题,但这是事实。
假设您有一个名称中带有>
字符的文件。在大多数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 <>
的转义机制?
答案 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"