2013-03-14 50 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