2014-04-03 48 views
0

我在讀gcc gnu-online-docs。我對於它在頭文件名中提到的關於\/的內容感到困惑。頭文件名中的斜槓是什麼意思?

它說:

但是,如果文件中出現反斜線,它們被認爲是 普通的文本字符,沒有轉義字符。處理C中沒有適合字符串常量的字符 轉義序列。 因此,#include "x\n\\y"指定一個包含三個反斜槓的文件名。 (有些系統解釋「\」作爲路徑分隔符。這些也解釋「/」以同樣的方式全部 ,這是最便攜的使用 只有「/」。)

是什麼的意思「一些系統「在這一段?這是否意味着實施取決於操作系統 - Windows/Linux? (我知道#include <linux/module.h>/指定的路徑)

回答

4

在Windows中,/\功能路徑組件分隔(分割目錄名從事物的名稱的目錄內)。在目前普遍使用的基本上所有其他操作系統中,只有/可用於此功能。

通過採取\字面上頭文件的名稱,而不是一個轉義字符,因爲它是在正常的字符串,GCC的預處理器容納反斜槓,例如寫Windows專用代碼

#include <sys\types.h> 

它是非常不可能的程序員預期包括其名稱爲文件「sys ypes.h」(即之前的「Y」空白是硬標籤)。本手冊中的文本旨在告訴您,如果將這些代碼移到Unixy系統中,則此類代碼將無法工作,但如果您使用正斜槓編寫代碼,則將在Windows上工作。

我碰巧寫了你引用的段落,但那是十多年前的事了,我不記得爲什麼我沒有使用「Windows」這個詞。

VMS和一些IBM大型機操作系統具有完全不同的路徑名語法,但這些語法從未得到GCC的很好支持,並且我的理解是,尚存的安裝趨向於安裝POSIX兼容性層。

+0

好吧..但不是GCC負責這種解釋和轉換?而且GCC在linux和windows(MinGW)上都支持,所以爲什麼不同? – brokenfoot

+0

GCC將字符串'foo \ bar.h'逐字傳遞給'open'。它是解析路徑名分隔符的操作系統。它可以「解釋」字符串,只要它不處理* - 不管作爲一個轉義序列(對比常規字符串常量),我想;但* *行爲*在所有支持的主機操作系統中都是一致的。 – zwol

+0

Ohkkk ..明白了..謝謝!哇!你寫的文件?這是我的榮幸,直接與你談談:) – brokenfoot

1

請記住,在普通字符串,\n是一個換行符,\t是一個標籤,\a是警報等

文本意味着,如果你寫的:

#include <sys\alert.h> 

\a序列被視爲兩個字符,反斜線和「A」,而不是作爲一個單獨的字符「告警」。也就是說,該文件被稱爲alert.h,並且在編譯器搜索標題的目錄之一的某個目錄的某個目錄中找到目錄sys。通常,在一個字符串中,"sys\alert.h"意味着一個名字's','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也會將/視爲\

+0

你的意思是斜槓'\'不會被轉義並且是文件名的一部分?在你的例子中,它應該表示'sys \ backtrack'是一個* Name *,它並不意味着在'sys'文件夾中包含一個名爲'backtrack'的文件?這有點令人困惑,請耐心等待。謝謝! – brokenfoot

+0

不;這意味着'sys \ backtrack.h'是sys文件夾中的一個文件,而不是頭文件名是's','y','s',退格,'a','c',.. –

+0

好吧,明白了。謝謝! – brokenfoot

相關問題