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

2024-02-25

我有一些 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 and benchmark.c?

我知道头文件应该包含函数声明,而源文件应该是实际函数所在的位置定义居住。下面的代码正确吗?即,应该#ifdef WIN32指令是否存在于我下面的两个文件中?或者应该全部都在.c file?

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

头文件和 c 文件一起形成“代码模块”(或者如果您愿意的话:ADT、类等)。

头文件始终被视为用户界面您的代码,其中“用户”是要使用您的模块的程序员。它绝不能包含任何代码或变量定义,句号。

而c文件包含实际的实现,这对用户来说不感兴趣,也不应该引起他们的任何关注。 c 文件应该使用私有封装,用户不需要知道的所有内容都应该在该文件中。

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


至于你的具体程序,应该按以下方式设计:

基准测试.h

#ifndef BENCHMARK_H
#define BENCHMARK_H

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

#endif

基准测试.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()在 C 中表示“接受任何参数的函数”。这种风格很差,请使用void反而。 C 和 C++ 在这方面是不同的。在 C++ 中,func() and func(void)意思是一样的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将其拆分为头文件和源文件? 的相关文章

  • 使用 TCP 套接字在本地代理视频

    我一直对向媒体浏览器添加对视频播客的支持非常感兴趣 我希望用户能够浏览可用的视频播客并从互联网上流式传输它们 这真的很容易 因为媒体播放器等将愉快地播放存在于云中的文件 问题是我想在本地缓存这些文件 因此同一集的后续观看将不涉及流式传输 而
  • 如何在 Caliburn.Micro 中使用 Conductor 的依赖注入

    我有时用Caliburn Micro http caliburnmicro com创建应用程序 使用最简单的 BootStrapper 我可以像这样使用 IoC 容器 SimpleContainer private SimpleContai
  • 为什么在 lambda 内部引发异常是 C# 7 的一项功能? [复制]

    这个问题在这里已经有答案了 该语句在 VS2015 中无法编译 但在 VS2017 中可以编译 var example new Action gt throw new Exception 为了支持在 lambda 表达式内抛出异常 必须对
  • 为什么使用数组索引循环数组比指针访问慢?

    我正在读Kochan的书 Programming in C 在第 14 页的 指针和数组 部分中 264 他说 一般来说 索引数组的过程比执行索引过程花费更多的时间 访问指针内容的过程 其实这也是主要原因之一 为什么使用指针来访问数组的元素
  • C语言实现延时函数

    我想使用空循环实现延迟函数 但是完成一次循环所需的时间取决于编译器和机器 我希望我的程序自行确定时间并将程序延迟指定的时间 谁能给我任何想法如何做到这一点 注意 有一个名为delay 的函数可以将系统暂停指定的毫秒 是否可以在不使用此功能的
  • 表达式访问者仅为某些 lambda 表达式调用 VisitParameter

    我希望能够使用嵌套扩展方法将 EF 中的实体投影到相应的视图模型 参见我之前的问题使用扩展方法在 EF 中投影单个实体 https stackoverflow com questions 39585427 projection of sin
  • .NET 中的 Class.forName() 等效项?

    动态获取对象类型然后创建它的新实例的 C 方法是什么 例如 如何在 C 中实现以下 Java 代码的结果 MyClass x MyClass Class forName classes MyChildClass newInstance Lo
  • 为什么 fgets 接受 int 而不是 size_t?

    功能如strcpy malloc strlen 和其他各种接受他们的参数或返回值作为size t代替int or an unsigned int出于显而易见的原因 一些文件功能 例如fread and fwrite use size t以及
  • 带有嵌入 Flash 视频的 PDF 示例?

    有谁知道我在哪里可以查看嵌入 Flash 视频的 PDF 示例 我知道问这个问题很愚蠢 因为你会认为任何面向技术的用户都应该能够使用谷歌找到一个 但我真的找不到 我的另一个问题是 使用 C 中的 API 将 Flash 视频嵌入 PDF 文
  • 将视频上传/保存到数据库或文件系统

    我以前从未尝试过保存视频 所以我对此了解不多 我知道如果视频很小 我可以转换为字节数组并保存到数据库 但是为了提高效率 我想了解如何将任何上传的视频保存到我的服务器文件中 然后只保存该文件的文件路径我的数据库表中的视频 我完全不知道如何开始
  • 用 OpenCL C 编写快速线性系统求解器

    我正在编写一个 OpenCL 内核 它将涉及求解线性系统 目前我的内核太慢了 提高线性系统部分的性能似乎是一个不错的起点 我还应该注意 我并没有尝试使我的线性求解器并行 我正在研究的问题在宏观层面上已经是令人尴尬的并行 以下是我编写的 C
  • 可以通过模板间接访问基类中的私有类型

    我试图在编译时根据类型是否在给定范围内公开可用来选择要使用的类型 最好直接看代码 include
  • FFplay成功移入我的Winform中,如何设置它无边框?

    用这个代码 在 C 应用程序中显示 tcp 视频流 来自 FFPLAY FFMPEG https stackoverflow com questions 14201894 show a tcp video stream from ffpla
  • 将旧的 Unity 代码升级到 Unity 5

    在触发按钮上播放动画的代码似乎不起作用 我在 Youtube 上看到了一个视频 内容很简单animation Play 它可以在该视频上运行 但我无法让它在我的计算机上运行 我做错了什么还是团结改变了它 请帮助我在网上找不到解决方案 所有
  • ef core 在更新数据库期间不使用 ASPNETCORE_ENVIRONMENT

    我使用 Visual Studio 通过一定的迁移来更新我的所有环境 使用下面的命令效果很好 update database Migration initMigrationProduct c ProductContext Environme
  • 为什么最小的 int -2147483648 的类型为“long”? [复制]

    这个问题在这里已经有答案了 对于一个学校项目 我必须编写 C 函数 printf 的代码 一切进展顺利 但有一个问题我找不到好的答案 所以我来了 printf PRINTF d t d n 2147483648 告诉我 gcc Werror
  • 链接到ntdll.lib并调用ntdll.dll内部的函数

    我最近正在对私有 API 进行一些研究 我尝试调用诸如NtOpenFile在 ntdll dll 中LoadLibrary and GetProcAddress在运行时 幸运的是 它成功了 今天早上我在电脑上进行了文件搜索 发现ntdll
  • Rx 在不同的线程上生产和消费

    我试图通过此处的示例代码来简化我的问题 我有一个生产者线程不断地输入数据 并且我尝试在批次之间添加时间延迟来对其进行批处理 以便 UI 有时间渲染它 但结果并不如预期 生产者和消费者似乎在同一个线程上 我不希望批处理缓冲区在正在生成的线程上
  • 如何解决 boost::multi precision::cpp_dec_float 除法错误

    除以boost multiprecision cpp dec float有某种舍入误差 如下 include
  • Membership.ValidateUser() 的目的是什么

    我一直在学习有关MembershipProvider类 我认为Membership ValidateUser 方法应该用于登录用户 然而我刚刚了解到有一个FormsAuthentication Authenticate 目的是什么Valid

随机推荐

  • .NET LocalReport / .rdlc AppDomain 问题

    我正在使用 Microsoft Reporting WebForms LocalReport 和 rdlc 报告文件生成 pdf s 这是在 Windows 服务 NET 4 6 x64 VS2015 的后台完成的 我有两个问题 Windo
  • 多个 canActivate 防护在第一次失败时全部运行

    我有一条有两个人的路线canActivate警卫 AuthGuard and RoleGuard 首先 AuthGuard 检查用户是否已登录 如果没有 则重定向到登录页面 第二个检查用户是否定义了允许查看页面的角色 如果没有 则重定向到未
  • 为什么 imagemagick 中的 PNG 图像的 readimage 和 writeimage 需要花费大量时间?

    我正在使用 Imagemagick 版本 7 0 5 4 来执行图像处理操作 例如裁剪 调整大小等去图形 https github com gographics imagick图书馆 我还管理一个魔法棒对象池 Features Cipher
  • 常量折叠的具体规则是什么?

    我刚刚意识到 CPython 似乎对表示相同值的常量表达式的处理方式与常量折叠不同 例如 gt gt gt import dis gt gt gt dis dis 2 66 1 0 LOAD CONST 0 2 2 LOAD CONST 1
  • BigQuery 的速度是否足以满足实时现场请求

    我正在研究是否可以使用 BigQuery 及其 API 根据访问者查看的内容进行现场查询 因此 响应时间至关重要 我加载了一个包含 10k 行 4 列 的非常简单的结构化数据集 并运行了一个非常简单的查询 这需要 1 到 2 秒的时间 希望
  • CorFlags.exe /32BIT+ 如何工作?

    我想我的问题是关于CLR http en wikipedia org wiki Common Language Runtime装载机 我想了解背后的机制CorFlags exe http msdn microsoft com en us l
  • 无法按升序对列表进行排序

    Map
  • 实验::可选的 nullopt_t 构造函数

    Here http www open std org JTC1 SC22 WG21 docs papers 2013 n3793 html optional nullopt被描述为nullopt t and nullopt为了optiona
  • EKCalendar 中的“完整日历同步”到底是什么?

    的文档EKCalendar类指出了这一点calendarIdentifier财产 与日历完全同步将丢失此标识符 你应该 有一个处理标识符为 no 的日历的计划 通过缓存其其他属性 可以更长时间地获取 完全同步 究竟何时发生以及除了calen
  • pySpark将mapPartitions的结果转换为spark DataFrame

    我有一项工作需要在分区的 Spark 数据帧上运行 该过程如下所示 rdd sp df repartition n partitions partition key rdd mapPartitions lambda x some funct
  • 在 Symfony 2 中强制用户登录

    每当我尝试删除anonymous security yml 中的配置 系统最终返回错误 310 重定向循环 这是到目前为止的配置 firewalls secured area pattern anonymous form login che
  • 至少一个数字和一个大写字母的javascript正则表达式

    检查给定字符串是否至少包含一个数字和一个大写字母的正则表达式是什么 提前致谢 我正在这样做 function validate pass var var password document getElementById npassword
  • (void)var 实际上做了什么?

    考虑以下main int main int argc char argv return 0 编译后cc Wall Wextra 生成 未使用的参数 的警告 当我不需要在函数中使用参数时 例如在信号处理函数 http en wikipedia
  • 我需要 Sybase 数据类型来保存不定长度的字符串。

    我的要求是声明一个接受最大大小的 xml 值的数据类型 问题 Sybase 中有 text xml 或 varchar max 数据类型吗 有文本数据类型 您可以找到更多信息here http infocenter sybase com h
  • form_tag 用于创建/更新操作 Rails 3

    我的路线文件如下所示 scope locslug userslug do post rate stars gt articles rate as gt rate article end 我正在尝试生成一个表单 其中包含针对rate文章中的动
  • 可以在 VS 2008 中默认禁用 XAML 设计器吗?

    我的许多 XAML 页面都是手动设计的 当我打开它们时不需要在设计器中显示 我更喜欢只显示 XAML 页面 大多数时候设计师都会妨碍 是否可以默认禁用设计器 并在我改变主意时提供 恢复加载设计器 链接 Tools gt Options gt
  • C# 内部访问修饰符

    我想将类密封在命名空间中 我正在查看 内部 访问修饰符 但这似乎只是在程序集中密封类 我可以将类密封在命名空间中吗 或者我必须将东西移到单独的程序集中吗 但随后我会遇到 Visual Studio 拒绝循环装配引用的问题 不 没有特定于命名
  • Eclipse ADT 错误:无法运行程序 adb

    我使用的是 Ubuntu 刚刚安装了适用于 64 位 Linux 的 Android SDK 仅 SDK 然后我安装了 Eclipse 的 ADT 插件 当我重新启动 Eclipse 时 它 要求我打开 SDK 管理器并安装一些操作系统 S
  • Microtime() 对于 C 和 C++ 等效吗?

    我想知道 C 中是否有与 PHP 函数 microtime 等效的函数andC 我环顾四周 但找不到明确的答案 Thanks 没有与 PHP 的 microtime 完全相同的函数 但您可以基于以下代码创建具有类似功能的函数 Mac OS
  • 如何将其拆分为头文件和源文件?

    我有一些 C 代码 我想将其拆分为头文件和源文件 ifndef BENCHMARK H define BENCHMARK H ifdef WIN32 include