2012-11-27 64 views
1

在C中,我們可以包括文件作爲#include "filename.h"
但對於例如,如果filename.h有內容 -文件包含頭文件而不是文件名可能在C?

#ifndef FILE_NAME_GUARD 

#define FILE_NAME_GUARD 

//contents 
. 
. 
. 

在我的另一個文件,我可以包括上述文件作爲#include <FILE_NAME_GUARD>而不是#include "filename.h"

我試過這種方式,我很驚訝地發現沒有編譯器錯誤或鏈接器錯誤。但是,有這樣的警告:

FILE_NAME_GUARD: No such file or directory 

請澄清有助於我們是否可以包括其multiple_header_guard名稱而不是文件名頭?

+1

什麼樣的C編譯器爲缺少的包含文件發出純粹的*警告* –

回答

0

實際上,在包含語句中的<>""之間發生的事情幾乎完全實現了定義,因此您不能肯定地說。

從技術上講,一個實現可能記得哪些文件映射到哪個守護名稱並智能地處理它,但我從來沒有在野外看到過。

而且,根據您的警告消息判斷,您的實施也不會這樣做。

+0

當然,這當然不會是標準的。 –

+0

@比利,如果按照標準,你的意思是匹配大量的實現做什麼,你是正確的。但是,如果您查看c11,則會指出「指定位置(包含」文件「的位置是如何找到的 - pax),或標識的標頭是實現定義的。」唯一的要求是分隔符內部的東西唯一地標識了要包含的「文件」(並且它根本不必是物理文件,它可以由編譯器注入)。 – paxdiablo

+0

是的,的確如此。但是便攜式程序不能依賴這種行爲。 –

1

否 - 除非您用於警衛宏的名稱恰好爲與文件名匹配。例如,您可以包括像這樣的文件:

#define filename <stdio.h> 
#include filename 

filename將是宏觀更換,所以結果相當於:

#include <stdio.h> 

所以,如果你使用的頭後衛宏精確匹配要包含的文件的名稱(包括引號或尖括號),可以使其工作 - 但否則會失敗。我認爲這樣寫代碼不是一個好主意。在大多數情況下,它似乎沒有任何意義 - 只有在頭文件已經包含時纔會定義頭文件保護宏,這正是您不需要(通常)包含它的情況。

+0

好的解決方案,但可能最好不要這樣做,無論如何。 – 2012-11-27 06:18:55

+1

是的,但然後頭衛兵會阻止再次處理該文件。在文件被處理之前,守護宏不會被定義,所以#include會失敗。 – rici

0

請幫忙澄清一下,我們是否可以用一個包含multiple_header_guard名稱的頭文件而不是文件名?

不,你不能,因爲預處理器不是魔法。

0

您不能通過其標頭保護宏包含文件。通常,頭文件保護宏被定義爲空字符串,並且很難包含由空字符串命名的文件。

你可以寫:

#define MAGIC_HEADER "magic.h" 
#include MAGIC_HEADER 

其中#include之後使用的宏觀匹配的形式"name"<name>之一。但是,用標頭守衛來試試這個沒有意義。在定義頭文件保護宏之前,您已經包含了該文件,並且不希望再次這樣做(在<assert.h>處點頭,這可以多次包含,每次都有不同的效果,具體取決於NDEBUG宏是否被定義)。