头文件中声明static修饰的函数为什么能在其他源文件中使用

一文讲解 声明、定义、extern、static、const的区别联系?如何定义?放到.h还是.c? 声明和定义的区别 因为C++支持分离式编译,也就是将代码放到多个不同文件中,那为了在不同文件中使用相同的数据,就必须将声明和定义分离开。 首先,定义指的是为变量分配存储空间,真真正正地创造物理上的二进制代码。如下列代码 #include <iostream> using namespace std; int fc(){ //以下三行均为定义加声明 int i=0; int j=1; int k; //以下为赋值操作, i = 100; j = 5; 阅读详情
1.static修饰的函数在源文件中定义并在头文件中声明

        1、如果在其他多个其他源文件中包含这个头文件,但没有使用static修饰的函数,编译可以正常通过

        2、如果在其他多个其他源文件中包含这个头文件,并使用static修饰的函数,编译当然会直接报错,因为链接器找不到函数的定义

        此时因为static的内链接性,在其他文件中找不到它的定义

2.static修饰的函数在头文件中声明并完成实现

        如果在其他多个其他源文件中包含这个头文件,因为#include在预处理只是简单展开,每个源文件实际上都得到了这个静态函数的一个私有副本。每个源文件都包含了该函数的完整定义,并在编译时独立生成该函数的代码。由于 static 修饰符的作用,链接器不会试图将这些不同的函数定义合并成一个或检查它们的重定义。

        此时虽然在各自.c文件中static修饰的函数还具有内链接性,但明显与最初的初衷背离,反而徒增了许多不必要的拷贝

3. 总结

        如果在头文件中 直接实现static 函数确实可以使其在其他源文件可用,但可能导致代码膨胀等等问题。

C++报错信息:LNK2001:无法解析的外部符号 原因分析及解决方法 C++报错信息:LNK2001:无法解析的外部符号 解决方法及原因分析,error LNK2019: 无法解析的外部符号 阅读详情

相关推荐

C++链接报错: error LNK2001: 无法解析的外部符号

一般说

m0_60352504的博客 1万+

static详解

static用法详解

qq_42981122的博客 754

基于粒子群算法的PID控制器优化设计

粒子群算法、PID、寻优

qq_46107700的博客 2万+

头文件中使用static关键字

static关键字主要修饰两种东西:变量和函数。 在头文件中定义static变量和static函数: 变量:众所周知,static变量只能在定义它的文件中使用。这里的文件指的是cpp源文件。如果在头文件中定义了static变量,那么,所有包含这个头文件的源文件都会定义自己的static变量,而不是使用该头文件中的static变量。所以也就造成了,在头文件定义static变量,其他包含头文件的...

timerzip的博客 1万+

倍福ADS通讯协议深度解析——从握手到数据包的完整旅程

本文以工程师视角,通过Wireshark抓包实战,深度解析了倍福ADS通讯协议的完整工作流程。从TCP三次握手建立连接,到拆解AMS/TCP信封、AMS Header地址与命令解析,再到ADS Data读写请求的载荷构成,完整呈现了一次数据通讯的“旅程”。文章重点剖析了协议包格式,并结合实际案例,提供了基于协议分析的故障排查思路,帮助开发者深入理解并精准调试工业自动化系统通讯。

weixin_29231725的博客 151

华为ENSP虚拟网络与本地物理网卡高效桥接实战指南

本文提供了一份详细的华为ENSP虚拟网络与本地物理网卡桥接实战指南。通过清晰的四步操作,帮助用户打破虚拟实验环境的“孤岛”限制,实现ENSP设备与真实局域网及互联网的互通,从而进行更真实的协议测试、软件升级和混合网络环境搭建。

qsc90123456的博客 537

Static总结

静态全局变量 静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的。而全局变量是不显式用 static 修饰的全局变量,全局变量默认是有外部链接性的,作用域是整个工程,在一个文件内定义的全局变量,在另一个文件中,通过 extern 全局变量名的声明,就可以使用全局变量。 未经初始化的静态全局变量会被程序自动初始化为0(在函数体内声明的自动变量的值是随机的,除非它被显式初始化,而在函数体外被声明的自动变量也会被初始化为 0);静态局部变量 静态局部变量 静态局部变量一般在声明处初始化,如果没

sang_12345的博客 3311

crowdcountingp2p代码复现

前面学习了一下论文:Improved Field-Based Soybean Seed Counting and Localization with Feature Level Considered该论文的模型原型由CrowdCounting-P2PNet改进而来这里先复现一下CrowdCounting-P2PNet模型,然后再学习P2PNet-Soy模型。

m0_73832962的博客 2327

C语言static和inline

如果一些源文件要使用该函数,由于static函数仅在当前源文件作用域可见,那么必须在每一个要使用该函数的源文件中都有函数实现,如果仅在一个源文件中实现,其他源文件使用则会编译错误,因为这个实现对于其他源文件是不可见的。static变量的作用域只限制与定义它的源文件中,其他源文件不能访问。如果头文件中有static变量,由于不同源文件中的static变量可以同名,那么在所有包含该头文件的源文件中都定义了仅自己可见的static变量,不同源文件中使用的也是仅属于自己的static变量,绝不是同一个。

冯岳松的博客 1620

TSMaster如何用珠海创芯CAN卡实现高效CAN通信(附完整驱动安装指南)

本文详细介绍了如何使用TSMaster软件与珠海创芯CAN卡实现高效CAN通信,包括驱动安装、系统配置、ControlCAN.dll替换及TSMaster集成配置等关键步骤。通过实战指南和故障排除技巧,帮助工程师快速搭建稳定可靠的CAN通信测试环境,适用于汽车电子和工业控制等领域。

weixin_29201859的博客 479

2、机器人控制技术:阻抗/导纳控制与强化学习的融合

本文探讨了阻抗/导纳控制与强化学习在机器人控制中的融合应用。阻抗/导纳控制广泛应用于外骨骼和跟踪控制,通过改进方案提升建模误差下的鲁棒性;强化学习则为解决维度灾难、实现最优交互提供了有效途径,尤其在大输入空间、连续时间系统、冗余机器人及鲁棒控制中表现突出。结合近似器与合理奖励设计,强化学习可在无模型情况下实现高效控制。未来,两者融合有望推动更智能、更安全的机器人系统发展。

ice55的博客 299

static和inline在C++头文件中的使用

先上例子: // foo.hpp #ifndef FOO_HPP #define FOO_HPP void foo() { // } #endif // a.cpp #include "foo.hpp" void func_a() { foo(); } // b.cpp #include "foo.hpp" void func_b() { foo(); } // main.cpp extern void func_a(); extern void func_b(); int...

nihao_2014的博客 1301

PCIe-Orders set Blocks之symbol对齐

有序集的使用场合很多,如在链路link阶段,进入polling后,便开始有序集的发送。一个 Ordered Set Block 包含一个同步头,后跟一个有序集。多通道链路的所有 Lane 必须同时传输相同的有序集,而且有序集的第一个符号定义了有序集的类型。但在PCIE中,8GT/s及以上的速率,采用的是128b/130b编码。128-bit是想要传输的payload,实际会传输130-bit,多出来的2-bit就是sync header。Block有两种,通过Sync header区分:10b:表示data

weixin_44700185的博客 813

C++编译链接的理解与static修饰全局函数

1、C++编译链接的理解 首先,C++链接的逻辑是:对构建目标target,其int main()入口函数所在的文件通过#include "myfunc_class.h"包含函数或类的声明,这些头文件内也可以写有实现从而都不需要.cpp文件,但这样做就违背了“在头文件中只包含声明使头文件内容紧凑清晰”的初衷,所以一般会在对应的"myfunc_class.cpp"文件中写有实现。然后这些“依赖文件”又可以有其他依赖文件,从而形成如下的拓扑依赖关系: main.cpp<——myfunc_clas...

HayPinF的博客 574

AUTOSAR进阶图解==>AUTOSAR_SWS_ADCDriver

本文深入解析了AUTOSAR ADC Driver的架构设计和技术实现。主要内容包括:1)ADC Driver在AUTOSAR分层架构中的定位及核心功能;2)详细的模块架构设计,涵盖初始化管理、组转换管理、优先级处理等核心子组件;3)全面的配置模型说明,包括主配置类、通用配置、通道配置等关键数据结构;4)状态机机制和操作序列分析。通过分层设计和标准化接口,ADC Driver实现了硬件抽象和软件解耦,提供了良好的可移植性和可维护性。

一名留德华的,康德的信徒的,专注于汽车电子领域的博客 786

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

(C语言)函数详解(下) 项目多文件操作 extern ,static详解

一般我们在使用函数的时候 ,直接将函数写出来就使用了。比如:我们要写一个函数判断一年是否是闰年。上面代码中划红线的部分是函数的定义 ,划黄线的部分是函数的调用。这种场景下是函数的定义在函数调用之前 ,没有问题。

2301_81224771的博客 1540

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

头文件和源文件以及#include<***.h>是干啥的,定义和声明到底应该写在哪?#ifndef #ifndef #endif有啥用?为啥会有重复定义错误

头文件 源文件 #include< .h>是干啥的?   inlcude <***.h>的作用就是为了让不同cpp文件可以相互引用(把所有代码都写到一个cpp文件也太长了!)。那么先从最简单的开始,没有.h 文件的cpp文件可以相互引用吗?答案是肯定的。 /*cod1.cpp文件*/ #include <iostream> using namespace std; void fun(){ cout << "fu"; } /*cod.cpp文件*

weixin_44845956的博客 1657

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

static 关键字在定义成员函数的时候报错: Cannot declare member function ...to have static linkage“

static 关键字在定义成员函数的时候报错: Cannot declare member function ...to have static linkage“

Serven的博客 1万+

warning: ‘stati’ declared ‘static’ but never defined [-Wunused-function] static void Function_A( );

1、某源文件×××.c中包含函数: static void Function_A() { … } 2、某头文件×××.h文件中有函数Function_A的声明: //×××.h static void Function_A( ); 3、源文件×××.c中include进common.h 【编译报错】:warning: ‘stati’ declared ‘static’ but never defi...

lexiaoxiaoxiao的博客 1861

C语言基础知识点:static与extern

多文件运用、static、extern

2301_77367034的博客 330

(持续更新中!!~)6、原来可以这样理解C语言_函数(8/8)函数的声明和定义

⼀般我们在使⽤函数的时候,直接将函数写出来就使⽤了。⽐如:我们要写⼀个函数判断⼀年是否是闰年。//判断⼀年是不是闰年return 1;if(r == 1)printf("闰年\n");elseprintf("⾮闰年\n");return 0;if(r == 1)printf("闰年\n");elseprintf("⾮闰年\n");return 0;

do_yo的博客 1172

函数(2)

在企业工程中,代码通常被拆分为多个文件以提高可维护性。函数的声明和类型定义通常放在头文件(.h)中,而函数的实现则放在源文件(.c)中。例如,add.c文件包含Add函数的实现,add.h文件包含其声明,test.c文件通过包含add.h来调用Add函数。此外,C语言中的static和extern关键字用于控制变量和函数的可见性和生命周期。static修饰局部变量时,将其生命周期延长至程序结束,但作用域不变;修饰全局变量或函数时,限制其只能在定义的文件内使用。extern用于声明外部符号。

2301_79175336的博客 183

C函数函数

这样,在不同的其他文件中即使有同名的内部函数,也互不干扰,不必担心所用内部函数是否会与其他文件模块中的函数同名。声明的话,一个文件中的函数既可以被本文件中其他函数调用,也可以被其他文件中的函数。如果在定义函数时,在函数首部的最左端加关键字extern(可省略),则此函数是。如果一个函数只能被本文件中其他函数所调用,它称为内部函数。在需要调用此函数的其他文件中,需要对此函数作声明(不要忘记,即使在本文件中调。un是一个内部函数,只能在本文件中使用,不能被其他文件调用。函数“是在其他文件中定义的外部函数”。

qq_33552379的博客 237

c语言文件名与类型的分离代码,c++类定义代码的分离

类文件实际工程中,对一个类的说明、架构、描述方法是: 往往分成头文件和实现的源文件,来实现代码的分离然后,源文件中包含类的头文件...头文件的包含问题:类对应的实现文件cpp、main主函数文件,都要包含类的头文件,因为要“单独”编译;main函数、其他文件要使用这个类的时候,都只需要包含该类的头文件足矣( 使用时、“编译”时, 无非是引用该类的成员和方法),而这些成员和方法已经在头文件中声...

weixin_29295541的博客 370

C语言(函数)

之前因为种种事件耽误,要准备考六级,准备搞实验,将C语言的学习耽误好几个月,现在开始认真回归,仔细学习。提示:以下是本篇文章正文内容,下面案例//函数声明int main()int y = 0;//函数的调用if(r == 1)printf("闰年\n");elseprintf("⾮闰年\n");return 0;//判断⼀年是不是闰年int is_leap_year(int y)//函数的定义return 1;

m0_71667305的博客 412

[C++] 链接器工具错误 LNK2005 (已经在main.obj中定义)

出现的问题如下两图所示: 比如我们现在有 fun.h 和 fun.cpp,也就是普通的声明文件与定义文件。但是我们有多个运行文件,也就是有多个main函数的cpp。即便只保留一个运行main,其他的注释main,也会因为头文件都包含了fun.cpp而导致这个错误的产生。因此,应当避免出现多个main文件的出现,要注释就整个文件都注释,而不是只注释一部分。 (1)对于头文件中声明的全局变量:使用 extern 修饰,在 fun.h 中写 extern int mod; 在 fun.cpp 中写 int mod

joyride_run的博客 4444
上一篇: const修饰整个函数、返回值、参数
下一篇: Callable 可调用对象 lambda表达式 “匿名函数“
思路可以啊
博客等级 码龄6年 91粉丝 16原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值