2013-03-14 72 views
1

我有一個關於鏈接C++文件的特殊問題。說我有一個名爲頭文件fmttime.h,我要鏈接它fmttime.cc(執行文件)繼承人什麼我迄今所做將頭文件鏈接到C++中的實現文件

ExpandedTime* localTime(struct timeval* tv, ExpandedTime* etime); 
int main() 
{ 
    struct timeval tv; 
    struct ExpandedTime etime; 
    gettimeofday(&tv, NULL); 
    localTime(&tv,&etime); 

} 

ExpandedTime* localTime(struct timeval* tv, ExpandedTime* etime) 
{ 
    tzset(); // Corrects timezone 

    int epochT = (tv->tv_sec) - timezone; // Epoch seconds with 
    int epochUT = tv->tv_usec; // Timezone correction 

    int seconds = epochT % 60; 
    epochT /= 60; 
    etime->et_sec = seconds; 
    etime->et_usec = epochUT; 

    int minutes = epochT % 60; 
    epochT /= 60; 
    etime->et_min = minutes; 

    int hours = (epochT % 24) + daylight; // Hours with DST correction 
    epochT /= 24; 
    etime->et_hour = hours; 

    printf("%d,%d,%d\n", seconds, minutes, hours); 
    printf("%d\n", epochUT); 
    printf("%d\n", timezone); 
    printf("%d\n", daylight); 
    return etime; 
} 

所以基本上我已經在包括fmttime.h標題如此。我對這整個過程有幾個問題。在fmttime.h中,我只有這個函數原型(這是我實際需要的所有東西)。

// Interface file for fmttime.h which is including the fmttime.c 
// Contains function prototype 

char* formatTime(struct timeval* tv, char* buf, size_t len); 

現在,如果我想在我的fmttime.cc實現文件中使用此功能,我需要重新聲明函數原型?或者可以跳過,因爲頭文件已經包含它,因此包含在fmttime.cc中,因爲它們通過#include鏈接。

所以我基本上想添加到.CC文件char * formatTime(struct timeval * .....)但我不確定是否仍然需要在.CC中聲明原型或在其中處理fmttime.h文件。

回答

6

#include荷蘭國際集團文件實際上是一種文本替換操作。標題的內容只是直接粘貼到包含它的文件中。

所以,你可以自己回答這個問題。試想一下,頭文件中的代碼實際上也是的實現文件(因爲是這樣)。

+0

哦,我明白了。感謝外行人稱爲編碼受損的解釋,例如我:)其實我還有一個問題,如果任何人都可以回答....在函數localtime()是我的邏輯在這裏正確的函數如何工作? 首先,我將指針傳遞給etime結構體。因此,我可以編輯擴展時間結構的字段內的對象....然後通過說「return etime」,我將該結構的編輯版本返回給main? – PresidentRFresh 2013-03-14 00:50:00

+0

@ user2163350:是的,你的推理是正確的。但是......爲什麼從函數中返回呢?只要明確指出'etime'應該是一個指向分配的'ExpandedTime'對象的指針,然後它將被填充並且不返回任何東西。通過一個預期會發生變異的爭論並接受它的一個副本是非常奇怪的。 – 2013-03-14 00:55:22

+0

是的,我認爲這很奇怪......因爲我不是編碼最好的,所以更多的是形式。我發現奇怪的是我編輯了ExpandedTime結構的內容然後再次返回。正如你所說,它已經改變了結構的領域。 但是,函數原型期望返回的參數是ExpandedTime *,所以很自然地我返回了etime。所以你說的只是刪除返回語句? 我的印象是,除非函數是無效的,否則不需要返回... – PresidentRFresh 2013-03-14 01:00:37

1

頭文件只包含在源文件中。他們沒有聯繫。在處理預處理器指令(如#include)後,編譯器會將源代碼編譯爲目標文件(.o)。然後將目標文件傳遞給鏈接器進行鏈接。

爲了您的最後一個問題,我建議你嘗試編譯您的.cc文件沒有#include指令,然後#包括頭文件和重新編譯。

0

記住:

.H/HPP - >函數原型,變量/結構/枚舉定義

.C /的.cpp - >函數的實現(.C /的.cpp要求包括它們的相應的報頭)

+0

除非你使用模板 – 2013-03-14 02:52:23