1

我有一个关于在 C++ 中链接文件的特殊问题。假设我有一个名为 fmttime.h 的头文件,我想将它链接到 fmttime.cc(实现文件),这就是我到目前为止所做的

 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 中处理它文件。

4

3 回答 3

6

#include读取文件实际上是一种文本替换操作。标头的内容只是直接粘贴到包含它的文件中。

所以,你可以自己回答这个问题。试想一下,头文件中的代码实际上也在实现文件中(因为它是)。

于 2013-03-14T00:45:24.553 回答
1

头文件仅#included 到源文件中。它们没有链接。在处理预处理器指令(例如#include)后,编译器会将源代码编译为目标文件 (.o)。然后将目标文件传递给链接器进行链接。

对于您的最后一个问题,我建议您尝试编译没有#include 指令的.CC 文件,然后#include 头文件并再次编译。

于 2013-03-14T00:49:14.827 回答
0

记住:

.h/hpp -> 函数原型、变量/结构/枚举定义

.c/.cpp -> 函数实现(.c/.cpp 需要包括其相应的头文件)

于 2013-03-14T01:21:01.280 回答