如何将其拆分为头文件和源文件?

时间:2015-02-25 09:31:54

标签: c header-files c-preprocessor preprocessor-directive

我有一些C代码,我想分成头文件和源文件:

#ifndef BENCHMARK_H
#define BENCHMARK_H

#ifdef WIN32
#include <windows.h>

double get_time()
{
    LARGE_INTEGER t, f;
    QueryPerformanceCounter(&t);
    QueryPerformanceFrequency(&f);
    return (double)t.QuadPart/(double)f.QuadPart;
}

#else

#include <sys/time.h>
#include <sys/resource.h>

double get_time()
{
    struct timeval t;
    struct timezone tzp;
    gettimeofday(&t, &tzp);
    return t.tv_sec + t.tv_usec*1e-6;
}

#endif

#endif

结果benchmark.hbenchmark.c的正确格式是什么?

我知道头文件应包含函数声明,而源文件应该是实际函数 definitions 所在的位置。以下代码是否正确?也就是说,#ifdef WIN32指令是否应该在我下面的两个文件中?或者它应该都在.c文件中?

benchmark.h

#ifndef BENCHMARK_H
#define BENCHMARK_H

    #ifdef WIN32
        #include <windows.h>
    #else
        #include <sys/time.h>
        #include <sys/resource.h>
    #endif

    double get_time();

#endif

benchmark.c

#ifdef WIN32

    double get_time()
    {
        LARGE_INTEGER t, f;
        QueryPerformanceCounter(&t);
        QueryPerformanceFrequency(&f);
        return (double)t.QuadPart/(double)f.QuadPart;
    }

#else

    double get_time()
    {
        struct timeval t;
        struct timezone tzp;
        gettimeofday(&t, &tzp);
        return t.tv_sec + t.tv_usec*1e-6;
    }

#endif

2 个答案:

答案 0 :(得分:2)

头文件和c文件一起形成一个&#34;代码模块&#34; (或者如果你将:ADT,班级等)。

头文件始终被视为代码的用户界面,其中&#34; user&#34;是程序员谁将使用您的模块。它永远不会包含任何代码或变量定义,句点。

虽然c文件包含实际的实现,这对用户不感兴趣,并且不应该与它们有任何关系。 c文件应该使用私有封装,用户不需要知道的所有内容都应该在该文件中。

以上是您设计C程序或任何语言的任何程序的方法。这不是主观的,它不是基于意见的,它是唯一的方式。如果你正在以不同的方式进行程序设计,那么你做错了。


至于您的具体计划,应按以下方式设计:

<强> benchmark.h

#ifndef BENCHMARK_H
#define BENCHMARK_H

    double get_time (void);
    /* documentation about how this function is used should be put here */

#endif

<强> benchmark.c

#include "benchmark.h"

 /*** Include files ***/
#ifdef WIN32
    #include <windows.h>
#else
    #include <sys/time.h>
    #include <sys/resource.h>
#endif

/*** Other stuff, for example constants, typedefs, static file scope variables ***/


/*** function definitions ***/

#ifdef WIN32

    double get_time (void)
    {
        LARGE_INTEGER t, f;
        QueryPerformanceCounter(&t);
        QueryPerformanceFrequency(&f);
        return (double)t.QuadPart/(double)f.QuadPart;
    }

#else

    double get_time (void)
    {
        struct timeval t;
        struct timezone tzp;
        gettimeofday(&t, &tzp);
        return t.tv_sec + t.tv_usec*1e-6;
    }

#endif

请注意double get_time()表示接受任何参数&#34;的功能。在C.这是糟糕的风格,而是使用void。在这方面,C和C ++是不同的。在C ++中,func()func(void)意味着相同的事情。

答案 1 :(得分:1)

我会简化它,头文件中唯一需要的是函数原型。

<强> benchmark.h

double get_time();

<强> benchmark.c

#ifdef WIN32
#include <windows.h>
#include "benchmark.h"

double get_time()
{
    LARGE_INTEGER t, f;
    QueryPerformanceCounter(&t);
    QueryPerformanceFrequency(&f);
    return (double)t.QuadPart/(double)f.QuadPart;
}

#else

#include <sys/time.h>
#include <sys/resource.h>
#include "benchmark.h"

double get_time()
{
    struct timeval t;
    struct timezone tzp;
    gettimeofday(&t, &tzp);
    return t.tv_sec + t.tv_usec*1e-6;
}

#endif