2015-05-11 45 views
3

其他程序員,是否可以在C中創建一個「變量」頭文件名稱?

我是新來的C預處理器,最近試圖在C中創建一個通用類庫(作爲練習),並且在創建標頭守護程序時遇到了一些問題。

所有預處理宏設置,這樣我就可以包括,用我的頭是這樣的:

#define TYPE int 
#include "myheader.h" 
#undef TYPE 

#define TYPE float 
#include "myheader.h" 
#undef TYPE 

int main(void){ 
    //Do stuff 
    MyFunc_int(); 

    //More stuff 
    MyFunc_float(); 

    return 0; 
} 

但是,當我需要在多個文件頭出現的問題。在這種情況下通常使用標題保護,但由於標題可以包含一次 - 對於每種類型,不能使用通常的構造或#pragma once

我的問題是:是否有可能創建一個「變量」頭部守衛爲不同的TYPE定義工作?

+1

我想在這種情況下,你將不得不刪除標頭警衛。因爲它們唯一的目的是在文件(c,C++或任何要編譯的文件)中包含頭文件一次。 – theadnangondal

+1

作爲你唯一的目的是包括一個標題多一次,那麼爲什麼還要包括那些編譯指示或警衛呢? – theadnangondal

+0

順便進入預處理器的好方法..+1 – theadnangondal

回答

2

當你想包含來自不同編譯單元的頭,你可以劃分頭成播放頭,並且起到了*.c文件的作用,例如私處的作用publich部分:

#define M_CONCAT(a, b) a##b 

TYPE M_CONCAT(TYPE, _min)(TYPE a, TYPE b); 

#ifdef IMPLEMENT 

TYPE M_CONCAT(TYPE, _min)(TYPE a, TYPE b) 
{ 
    return (a < b) ? a : b; 
} 

#endif /* IMPLEMENT */ 

然後,可將多個文件這個頭,但你必須包括頭前,以確保只有一個文件定義IMPLEMENT

#define IMPLEMENT // only in one file 

#define TYPE float 
#include "myheader.h" 
#undef TYPE 

#define TYPE int 
#include "myheader.h" 
#undef TYPE 

該文件可能是一個獨立的compil單元,myheader.c。但是,您必須小心執行所有類型的功能。 (但鏈接器會告訴你,你錯過了哪些類型。)

1

我建議:

  1. myheader.h取出#include警衛。
  2. 爲每個TYPE創建不同的頭文件。

intheader.h:

#pragma once 

#define TYPE int 
#include "myheader.h" 
#undef TYPE 

floatheader.h:

#pragma once 

#define TYPE float 
#include "myheader.h" 
#undef TYPE 

然後用:

#include "intheader.h" 
#include "floatheader.h" 

int main(void){ 
    //Do stuff 
    MyFunc_int(); 

    //More stuff 
    MyFunc_float(); 

    return 0; 
} 
+0

myheader.h中的警衛仍然不會允許這個被包含兩次 – theadnangondal

+0

@theadnangondal,true。你必須在'myheader.h'中刪除'#include'後衛。 –

0

我認爲你在尋找這樣的事情:

#if !defined HEADERGUARD && defined (TYPE==int) 
#define HEADERGUARD 
<stuff> 
#endif 

您可能希望擁有HEADERGUARD_int和HEADERGUARD_float,具體取決於您在* .h文件中執行的操作。更傳統上,人們會將其分成兩個* .h文件。

相關問題