2013-08-17 45 views
1

我已經在頭文件中聲明瞭一個函數,並在C++/C文件中定義函數。頭文件,其中聲明函數的地方包含在定義了函數的C++文件中。在C/C++文件中定義函數並在頭文件中包含相應文件

現在包含那個C++文件,只要在任何其他C++中需要該函數調用。 這是不好的做法嗎? 或者我應該只在.h文件中定義函數?


function.h

char *BoyerMoore_skip(char *string, int strLength); 

BM.cpp:

#include "function.h" 
char *BoyerMoore_skip(char *string, int strLength); 
{ 
    ... 
} 

main.cpp中:

include "BM.cpp" 
    int main() 
{ 
--- 
BoyesMoore_skip() 
} 
+2

這不是「_bad practice_」 – 2013-08-17 04:38:56

+2

您應該嘗試*不*在頭文件中定義函數。你必須處理ODR問題。 – chris

+1

看看這個: - http://stackoverflow.com/questions/453372/writing-function-definition-in-header-files-in-c –

回答

1

是的,如果您在多個區域包含該標題是不好的做法。所以包含的東西是這樣的:只要編譯器看到一個#include,它所做的就是取所有位於該區域的代碼,並將其插入#include所在的位置。現在,如果您一起編譯多個cpp文件,或#include包含相同文件的文件。這會多次插入該代碼塊,從而不必要地增加了程序的大小。另一個好的做法是在頭文件中使用#ifndef ...#endif來處理大型程序。它應該是這樣的:

說我有一個person.h文件編碼爲

#ifndef PERSON_H_ 
#define PERSON_H_ 

#include <stdio.h> 
#include <stdlib.h> 

typedef char NAME[41]; 

typedef struct date { 
    int month; 
    int day; 
    int year; 
} DATE; 

typedef struct person { 
    NAME name; 
    int age; 
    float height; 
    DATE bday; 
} PERSON; 
#endif 

這樣做是在編譯的預處理階段,如果不看PERSON_H_定義,它創建它並將該PERSON_H_標記下的#define和#endif之間的所有內容關聯起來。現在,每當預處理器遇到#include「人員。h「,它將檢查PERSON_H_是否已經存在,如果是的話,它將不再包含與PERSON_H_再次關聯的代碼,這防止通過頭文件包含等等多次定義函數

這是好的做法在頭文件中定義你的函數,它們被稱爲函數原型,它告訴編譯器哪些函數可以期待,原型與你所做的有些不同,你不需要聲明變量名,只需要聲明。所以,你的函數原型是:

char *BoyerMoore_skip(char *, int); 

,而不是

char *BoyerMoore_skip(char *string, int strLength); 
+0

@lon:謝謝。相關問題'#ifndef dictionary_h__ #define dictionary_h__ extern char * dictionary(char * buf); #endif'這是什麼意思? – user123

+0

請看上面的#ifndef --->#endif解釋。至於extern去,這是一些非常解釋性的東西:http://stackoverflow.com/questions/1433204/what-are-extern-variables-in-c http://www.geeksforgeeks.org/understanding-的extern-關鍵字在-C / – Ion

1

通常將所有函數聲明和#define放在一個單獨的頭文件中並將其包含在.c或.cpp文件中。但我不認爲你在做什麼是不好的做法。

3

它不一定被認爲是「壞習慣」,儘管習慣上將它們定義在單獨的頭文件中。

如果您在「主要方法」之前定義它們,您可能會遇到一些ODR問題,但是我會爲此付出代價。做你喜歡的事。

+0

什麼是ODR問題? – user123

+1

我認爲ODR是'一個定義規則':D – billz

+0

@billz我想它可以與兩者協同工作......我一直認爲這是網上爭議解決方案......哈哈哈哎呦。 – 2013-08-17 04:47:58

1

我解釋你的問題意味着你在另一個.cpp文件中包含一個.cpp文件。

如果這是你在做什麼,那肯定是不好的做法! 只要您(或您的IDE)爲鏈接器提供了所有相關文件,鏈接器就會將您的函數調用「連接」到函數定義。

通常的做法是在一個頭文件中聲明一堆相關的東西,並將該頭文件包含在定義這些函數的.cpp以及使用它們的每個.cpp中。當你需要那些「相關」的東西時,你通常還會在另一個標題中包含該標題。

1

這是一個昂貴的做法,而不是一個壞習慣。

編譯器應該:將此標記爲錯誤,迫使您刪除您認爲重複的定義,或發出警告並接受其中一個定義。

但是,這種做法的昂貴部分是,維護此代碼的下一位程序員最初會感到困惑,不得不花費一些時間考慮爲什麼要這樣做。沒有任何評論猜測會比比皆是。

真正的花費是如果兩個原型中的一個改變了,現在有一個多態性(假設C++)有可能產生各種新的錯誤,並再次迫使下一個程序員確定實際上存在兩個原型!

相關問題