(C语言)头文件实现的函数

(C语言)头文件实现的函数

http://www.diybl.com/ 2008-11-16  网络 点击: 239   [ 评论 ]
文章搜索:      【点击打包该文章】   
【本站开通在线QQ讨论群】

在C语言里面,有时候为了方便(方便的同义词是偷懒),函数就直接在头文件里面实现了。那么这样子有什么问题呢?

下面举个例子,这个例子只有3个文件

/* fun.h */
#ifndef FUN_H
#define FUN_H
void base(){};
void fun();
#endif 

/* fun.c */
#include "fun.h"
void fun()
{
    base();
}

/* main.c */
#include "fun.h"
int main()
{
    fun();
    return 0;
}

好,然后gcc一下

gcc -c main.c (通过)
gcc -c fun.c  (通过)
gcc -o main main.o fun.o (链接错误)

出现错误...“base()函数重定义!”

为什么重定义呢?因为#include是预处理部分,在编译之前由预处理程序在这个部分复制头文件的内容过来。所以在编译时候,main.o和fun.o文件都有base()函数的定义。那么链接程序就不知道链接那个定义好了(二义性啊)

如何解决呢,为了实现“声明和实现分开”这个目标最好就是把这个base函数的函数体移到源文件里面。如果由于某种原因真的要放在头文件中...也可以。

用static声明就可以了,静态函数的作用域是文件,而不是全局。比如,上面的例子将头文件里面的void base(){}改成static void base(){},那就OK。

这个static在c语言中的用法可以google下,上面的资料好多很详细滴。

顺便说说头文件的循环依赖的问题。

比如有三个头文件a.h b.h c.h,a.h里面有#include "b.h",b.h里面有#include "c.h", c.h里面有#include "a.h",那就会造成文件的循环依赖,后果是什么呢?

比如有个文件a.c,上面有#include "a.h",那在a.c文件编译之前,预处理程序就会不断的把这三个头文件的内容复制过来,超过了一定的数量,就会导致“头文件数太多”的编译错误。

解决方法呢,当然就是常见的#ifndef...#define...#endif组合了。不过要把前两个写在头文件的开头(一定是开头),最后一个写在最末尾。

这样的话,第一次展开a.h b.h c.h的时候就已经定义了宏,到了c.h中的#include "a.h"时候,遇到了#ifndef,由于这个宏在上一次展开时已经定义了,所以这部分就跳过去了。也就是每个头文件最多只在每个源文件里面包含一次。

但是即使编译链接没有问题,循环依赖也会降低开发效率,为什么?因为文件都在依赖,比如某一天,要改变a.h的一部分内容,然后所有依赖于a.h b.h c.h的文件都得重新编译...链接;所以现在的C++有“前向声明”的技巧可以缓解这个问题。(缓解并不是解决。)而JAVA运用的import机制就很好的解决了这个问题,真正实现了“实现与声明相分离”这个目标。

1分钟吃透一篇文献,借助AI辅助各部分精读,效率提升10倍(附AI提示词) 你现在是一名【研究领域】的资深博士,非常擅长阅读与分析长篇论文,那么接下来我会给你上传一篇论文,请你按照我的要求辅助我阅读。 阅读详情

相关推荐

SMPLify-X关键点映射与OpenPose格式转换实战

本文深入解析了SMPLify-X与OpenPose之间关键点映射与格式转换的实战方法。针对SMPL、SMPL-H、SMPLX等参数化人体模型与OpenPose 2D姿态估计标准之间的数据鸿沟,文章详细对比了双方的关键点定义差异,并提供了核心的Python转换代码与映射表构建思路。通过清晰的步骤讲解与调试技巧,帮助开发者实现3D关节数据到OpenPose标准格式的高效、准确转换,为动作捕捉、3D姿态估计等应用奠定数据基础。

weixin_29046035的博客 166

educoder线索二叉树第1关:头文件基本函数的实现

任务描述 本关任务:实现本实训所需头文件的基本函数。 相关知识 实验目的 掌握线索二叉树的有关知识; 掌握求解线索二叉树中结点前趋和后继的算法以及以相应次序遍历线索二叉树的算法; 掌握二叉树的线索化算法的设计。 线索二叉树是为了快速求解二叉树中结点在指定次序下的前驱和后继,而将二叉链表中空的左右孩子指针分别改为指向其前驱和后继结点而得到的结构,反映了运算对数据结构的设计的影响。因此,首先要了解线索二叉树的结构特点,其中原本为空的指针被修改为前驱和后继指针,使得对左右子树和线索的判断发生了变化。利用线索可以实

qq_46118539的博客 8326

从D3 00到FF FF:手把手解析RTCM3.2协议帧结构(附Python解析代码)

本文深入解析RTCM3.2协议帧结构,从同步头标识到CRC校验算法,详细讲解如何通过Python代码实现二进制数据解析。文章包含完整的RTCM3.2解析器实现,涵盖消息类型解码、CRC校验等关键步骤,并附赠特定消息类型(如1005型基准站坐标)的解析示例,帮助开发者快速掌握GNSS差分数据传输协议的核心技术。

weixin_42550052的博客 353

二叉树实验

数据结构C语言版

aiains的博客 3500

Ubuntu20.04系统Cuckoo sandbox所需环境搭建及安装(超详细图文)

请勿叫我大神,我只是互联网的搬运工~ 前言 本教程以Ubuntu20桌面版作为示范,服务器版同样适用,但可能稍微麻烦一点,服务器版本的话安装Xmanage套装使用可能会相对轻松一些,由于后面会使用到vbox的使用,对vbox命令行操作不熟悉的小伙伴用xmanage可能会相对轻松一点。 提示:以下是本篇文章正文内容,下面案例可供参考 安装ubuntu20桌面版 步骤1:转到https://ubuntu.com/download/desktop下载下载.iso。 步骤2:使用您选择的虚拟机监控程序(VMWa

ElsonHY的博客 1万+

代谢组学数据分析实战:用R语言从PCA、PLS-DA到OPLS-DA一步步搞定(附代码)

本文详细介绍了使用R语言进行代谢组学数据分析的全流程,从数据预处理到PCA、PLS-DA和OPLS-DA模型构建与验证。通过实际案例和代码示例,帮助研究者掌握关键分析技术,提升数据解读能力,特别适合生命科学领域的研究人员。

weixin_28689507的博客 133

为什么不推荐在头文件中直接定义函数?

这篇技术博客探讨了为什么不推荐在头文件中直接定义函数。它解释了在将函数定义放在头文件中的潜在问题,并提供了更好的替代方案。通过避免在头文件中定义函数,读者可以更好地管理代码的复杂性,并提高代码的可读性和可维护性

生活不易,喵喵叹气 3154

halcon 查找圆形

先找到大概位置进行拟合,然后再以拟合出的位置作为测量的大概位置进行找圆;

qq_59062726的博客 734

线索二叉树实验

【代码】线索二叉树实验。

m0_61820263的博客 1256

使用RustDesk或者AnyDesk的TCP隧道实现Codesys系列PLC的远程调试和下载

Codesys远程调试

exat500g的博客 7276

一文掌握 MongoDB 详细安装与配置(Windows / Linux / macOS 全平台)

本文详细介绍了MongoDB社区版7.0+在Windows、Linux和macOS三大操作系统上的完整安装、配置与安全加固流程。主要内容包括:各平台推荐安装方式(Windows使用MSI安装包、Linux通过官方仓库、macOS通过Homebrew)、基本配置参数说明、服务启动方法以及关键安全措施(如创建管理员用户和启用身份验证)。文章还提供了系统最低要求、下载地址、数据目录设置建议以及生产环境使用注意事项,适合开发、测试及生产环境部署参考。

数据知道的博客 6714

C++语言基础_第一讲:头文件、输入输出、格式、基本运算

程序 = 数据结构 + 算法 C++ 是在C语言基础上开发的一种集面向对象编程、泛型编程和过程化编程于一体的编程语言。不同于C语言,C++是一种面向对象的语言,在C语言的基础上,C++扩充了一些自己特有的知识,如bool类型、重载函数、模版、STL等。

weixin_42730572的博客 1579

解决微信小程序长页面滚动到底部点击底部的输入框后输入框漂浮且页面滚动到顶部

一、问题描述 项目中有一个长页面上部展示部分信息下部为信息录入,页面长度为三屏幕(不同手机屏幕大小略有差异),当滚动到第二屏或者第三屏去填写信息时点击输入框后输入框漂浮起来了并且页面向上滚动了一段距离,回到了第一屏中展示的内容。效果如图。 滚动到第二屏,证件号输入。 点击输入框 可以看到证件号输入框漂浮了起来并且页面滚动到了第一屏展示的内容。 注意:小程序是2018年上线,在2020年4月份之前该页面从未出现过这种现象。推测:微信的后续更新中对微信小程序基础库进行了重构,导致点击输入框后页

仰望星空的代码 3261

C语言当中头文件<string.h>当中一些库函数的拟实现

C语言当中头文件<string.h>当中一些库函数的拟实现

2301_80205070的博客 1159

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

c语言isupper函数头文件,C语言isupper函数介绍、示例和实现

C语言isupper函数用于判断字符是否为大写字母(A-Z)。在本文中,我们先来介绍isupper函数的使用方法,然后编写一个自定义的_isupper函数,实现与isupper函数相同的功能。1、包含头文件#include 2、函数声明int isupper(int c);3、功能说明判断参数c是否为大写字母,您可能会问:isupper函数的参数是int c,是整数,不是字符,在C语言中,字符就是...

weixin_26704651的博客 891

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

实现c语言中的string.h头文件的部分函数

实现c语言中的string.h头文件的部分函数

qq_47500842的博客 411

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

c语言md5函数头文件,【C】md5函数实现代码

网上找到的md5函数的代码,试了一下,可以用,记录一下。包括三个文件,依次如下:头文件md5.h#ifndef MD5_H#define MD5_Htypedef struct{unsigned int count[2];unsigned int state[4];unsigned char buffer[64];}MD5_CTX;#define F(x,y,z) ((x & y) | (...

weixin_39783771的博客 689

手动实现的C语言string.h 头文件的字符串函数

研究C语言,首先要明白其库函数…001#include 002char* strcpy(char* dest,constchar* src);  //字符串拷贝 003char* strcat(char* dest,constchar* src);  //字符串连接,返回dest字符串 004char* strncat(char* dest, constchar* src, intsize);//把src前n个字符串连接到dest,返回dest字符串 005int   strcmp(constchar* s

qinqqfirst的专栏 1912

C语言-----string.h头文件中相关字符串函数的模拟实现

strlen:用途:Get the length of a string.函数原型:size_t strlen( const char *string ); size_t表示无符号的意思,长度值肯定是无符号的。模拟实现:int my_strlen(const char *str) { int count = 0; assert(str != NULL); while (*str != '\0...

abc_xixi111的博客 1419

[deepseek] C语言头文件与汇编实现讨论

这个表记录了哪个目标文件提供了哪个符号(如 abc_asm.o 提供了 add_two_numbers),以及哪个目标文件需要哪个符号(如 main.o 需要 add_two_numbers)。他拿着工程师的设计图(main.o),看到上面需要一个工具,于是他去各个车间寻找,找到了贴着对应标签的工具(来自 abc_asm.o),然后把它们完美地组装在一起。他阅读了说明书,知道需要调用一个叫 add_two_numbers 的工具,并在他的设计图(main.o)上留下了安装这个工具的接口。

1808

c++ swap函数头文件_C语言自定义头文件

0.建立工程在建头文件之前,我们还是从建立一个C语言工程开始,所用工具:DEV C++ 第一步:文件 → 新建 → 项目图1 第二步:Basic → Empty Project 图2 第三步:选择路径(选择一个路径即可),保存之后就生成一个first.dev (工程文件)图3 第四步:保存之后,回到程序编辑界面,可以看到 first工程有一个未命名的编辑页面.图4 第五步:我们可以在这个页面写程...

weixin_39941732的博客 2810

【C语言】字符函数和字符串函数(1)

str是\0了,循环是照常结束,但是str还要++一次,str就指向\0后面了,根据我们前面的分析就是错误的,所以这里只能把str自增的语句写在循环体内,当然,如果是拷贝字符串则不用担心这一点,可以放心把自增写在循环判断条件中。原型解析:strcpy的第一个参数是我们拷贝字符串的目的地的首地址,也就是接收拷贝的数组的首元素地址,第二个参数是我们拷贝字符串的源字符串的首地址,它的返回值就是接收拷贝的目标空间的初始地址。strcmp的作用就是帮我们比较两个字符串的大小,那么比较的依据是什么呢?

hdxbufcbjuhg的博客 2269

listlength函数头文件_数据结构----头文件实现顺序表的创建、(c语言)小结

#include #include "mytest.h"void main(){test = 25;printf("test=%d\n",test);}mytest.h头文件内容如下:#ifndef _MYTEST_H_#define _MYTEST_H_int test;#endif现在用上面的例子来说下解VC编译器的工作:1.预处理阶段:编译器以.cpp文件作为一个单元,首先读这个文件,发现前...

weixin_39621427的博客 1015

使用stdarg.h头文件实现参数数量可变函数【C语言】

介绍使用stdarg.h头文件实现参数数量可变函数的步骤。

qq_45965652的博客 216

c语言自定义status头文件,如何自定义C语言.h头文件?

在项目实践中,如果一个.c文件程序过长,可以把文件中的函数单独放在一个头文件中,然后在.c中包含该头文件即可。这两天,根据所看的书《C语言的科学与艺术》和网上的资料,发现实际上有两种写法。写法1:在.h头文件中就包含函数的实现,这种头文件实际上是把函数放在一起,便于管理而已。这种情况下只有一个.h文件。写法2:在.h头文件中只包含一些函数的声明,没有具体的实现。函数的实现放在另外一个不包含main...

weixin_39838362的博客 2546

如何自定义C语言.h头文件?

在项目实践中,如果一个.c文件程序过长,可以把文件中的函数单独放在一个头文件中,然后在.c中包含该头文件即可。这两天,根据所看的书《C语言的科学与艺术》和网上的资料,发现实际上有两种写法。 写法1:在.h头文件中就包含函数的实现,这种头文件实际上是把函数放在一起,便于管理而已。这种情况下只有一个.h文件。 写法2:在.h头文件中只包含一些函数的声明,没有具体的实现。函数的实现放在另外一...

吉大秦少游 5万+
上一篇: C语言库函数大全(字母a)---使用说明(转)
下一篇: Super日语在线背诵 - 沪江网
mlxia
博客等级 码龄26年 28粉丝 410原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值