2014-10-08 40 views
1

我正在寫一個C語言的用戶空間(現在是最小的),並且我把它製作得像BusyBox,你可以通過調用帶有名字的符號鏈接來運行一個命令。我有一個「主」C文件,其中包含其中的所有其他文件(其他文件是頭文件),然後在符號鏈接名稱匹配時運行它們的代碼。我想知道是否可以在不同的頭文件中使用相同名稱的函數?在多個頭文件中使用相同的函數名是否是一種好的做法?

舉例來說,如果我有thing1.h

void help(void) 
{ 
    // Print help text for thing1 
} 

int thing1(int argc, char *argv[]) 
{ 
    if (something) 
     help(); 
} 

而且thing2.h

void help(void) 
{ 
    // Print help text for thing2 
} 

int thing2(int argc, char *argv[]) 
{ 
    if (something) 
     help(); 
} 

而且everything.c

#include "thing1.h" 
#include "thing2.h" 

int main(int argc, char *argv[]) 
{ 
    if (something) 
     thing1(argc, argv); 
    else 
     thing2(argc, argv); 
} 

它會更好那些幫助功能重命名爲thing1_helpthing2_help,還是可以離開它們原樣?

+1

你爲什麼不編譯你的樣本?如果你的編譯器說它不好,你不得不接受這個,不管網上的那些隨機的人想到它。 – nvoigt 2014-10-08 05:52:14

+0

爲什麼在頭文件中有代碼?這是不好的做法。 – weston 2014-10-08 05:52:52

+1

否;重複兩個頭文件中的help()函數並不是一個好主意。思考SPOT - 單點真相;也認爲幹 - 不要重複自己。將實際的代碼嵌入到頭文件中也不是一個好主意。你只應該爲'inline'函數做到這一點,並且只有當你知道你在做什麼。否則,標題只能包含變量和函數的聲明,而不能包含定義。 – 2014-10-08 05:54:55

回答

5

首先,請了解C preprocessor的工作原理和讀取documentation of cpp的方法。

請注意,預處理是純文本操作。所以你可以避免有任何頭文件和#include指令,例如通過複製和粘貼東西。這將是一個壞主意。

所以頭文件大多是一個傳統東西(然而,C99標準並強制一些標準的頭,像<stdlib.h><stdio.h>;以及POSIX規範還規定了以下幾個頭)。常見的做法包括:

  • 包裹頭文件的內容與include guard(禁用多個包含)
  • 只把聲明,不定義(往往是「全球」)函數,類型變量的頭文件。
  • static inline函數的定義放在頭文件中。

其實,標準頭包含(例如#include <stdlib.h>)甚至在原則上沒有任何stdlib.h文本文件實現:編譯器實現可能例如查詢數據庫來處理#include <stdlib.h>指令,但我不知道有編譯器這樣做。

有些人(包括我在內)將#include指令(特別是對於標準C99或Posix標頭)放入其頭文件中。其他人正在記錄要在其自己的頭文件之前包含的頭文件列表。

看看你的代碼的預處理形式(這是大多數編譯器所關心的,因爲預處理器是編譯器的第一階段)。你可以得到的使用GCCeverything.c預處理的形式

gcc -C -E everything.c > everything.i 

然後往裏everything.i用編輯器或尋呼機。

在實踐中,我會建議做 - 如果它真的是你的短一個thing2功能static inline,則有(不是幾個)標題:

// file thing.h 
#ifndef THING_INCLUDED_ 
// declarations 
void help(void); 
int thing1(int argc, char *argv[]); 
// definition: 
static inline void thing2(int argc, char**argv) { 
    if (something_with(argc, argv)) 
     help(); 
} 
#endif /*THING_INCLUDED_*/ 

然後把定義helpthing1例如您的everything.c並在其他#include指令後添加#include "thing.h"

1

這兩個幫助函數都應該是相應的c文件,那麼不會有名稱衝突,因爲它們對該編譯單元的範圍是私有的。

一般將代碼保存在c文件中,只保存h文件中的聲明。

相關問題