我正在阅读gcc gnu-online-docs。我对它在头文件名中提到\
或/
的内容感到困惑。
它说:
但是,如果文件中出现反斜杠,则会考虑它们 普通文本字符,不是转义字符。没有人物 处理适合于C中的字符串常量的转义序列。 因此,
#include "x\n\\y"
指定包含三个的文件名 反斜杠。 (有些系统将'\'解释为路径名分隔符。全部 其中也以同样的方式解释'/
'。它最易于使用 只有'/
'。)
本段中的“某些系统”是什么意思?这是否意味着实施取决于操作系统--Windows / Linux? (我知道#include <linux/module.h>
,/
指定路径)
答案 0 :(得分:4)
在Windows上, / 和 \ 都用作路径名组件分隔符(将目录名称与其中某个内容的名称分开)目录)。在当今常用的所有其他操作系统上,只有 / 才能提供此功能。 1
通过在头文件名中取 \ ,而不是普通字符串中的转义字符,GCC的预处理器适用于使用反斜杠编写的Windows特定代码,例如
#include <sys\types.h>
程序员非常不可能包含名称为&#39; sys ypes.h
&#39;的文件。 (在&#39; y&#39;是硬标签之前空白)。本手册中的文本旨在通知您,如果移动到Unixy系统,此类代码将无效,但如果您使用正斜杠编写它,则将在Windows上运行。
我碰巧写了你引用的段落,但那已经十多年了,而且我不记得为什么我没有使用&#34; Windows&#34;这个词。
1 VMS和一些IBM大型机操作系统具有完全不同的路径名语法,但这些从未得到GCC的良好支持,我的理解是,幸存的安装往往安装了POSIX兼容层反正。
答案 1 :(得分:1)
请注意,在普通字符串中,\n
是换行符,\t
是标签,\a
是警报等。
文字意味着如果你写:
#include <sys\alert.h>
\a
序列被视为两个字符,反斜杠和'a',而不是单个字符'alert'。也就是说,该文件名为alert.h
,位于编译器搜索标头的某个目录中的某个目录sys
中。通常,在字符串中,"sys\alert.h"
表示名称'','y','s',退格,'l','e','r','t ','。','h'。
同样适用于:
#include <sys\backtrack.h>
#include <sys\file.h>
#include <sys\newton.h>
#include <sys\register.h>
#include <sys\time.h>
#include <sys\vtable.h>
(我把名字看作是方便的,sys
可以被任何其他目录名替换,而<>
可以被""
替换。
#include <sys\386.h>
#include <sys\xdead.h>
#include <sys\ucafe.h>
#include <sys\U00DEFACED.h>
也被视为常规字符串,而不是包含八进制,十六进制或Unicode转义。
Windows是使用\
作为正式路径元素分隔符的主系统。但是,即使在Windows上,API也会将/
视为\
。