我有一些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.h
和benchmark.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
答案 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