前几天,一个同事跟我说在我们的代码库里面看到,一个static函数被放在了头文件里面,可构建的时候却没有报告链接错误。我的第一反应也是,函数被放在头文件里面,当这个头文件被多个源文件引用之后,再把那几个源文件编译产生的目标文件链接起来的时候,应该会产生重定义错误的……

后来又仔细一想,static关键字不正是解决不同的源文件中、同名函数的命名冲突问题的吗?于是,快速做了一个小验证:

//“static_func.h”
#include <stdio.h>
static void display() {printf("This is static function in a header file.\n");
}//“funcA.c”
#include "static_func.h"
void funcA() {printf("This is funcA...\n");display();
}//“funcB.c”
#include "static_func.h"
void funcB() {printf("This is funcB...\n");display();
}
//“main.c”
extern void funcA();
extern void funcB();
int main()
{funcA();funcB();return 0;
}

正常编译、链接没有问题,可执行文件也能正常执行,证明了存在同名static函数的不同源文件链接到一起是没有问题的。

虽然还不清楚编译器具体是怎么实现的,但是对于C语言的static函数可以简单的理解为,编译器在处理static函数时,可能把static函数所在文件的文件名当成了函数名的一部分,类似于C++中命名空间的概念。


使用‘nm’命令查看可执行文件,除了看到函数‘funcA’和‘funcB’之外,还看到了两个‘display()’,编译器最终是怎么区分这两个同名的函数的暂时还没有搞清楚,有待后续再进一步研究。

C语言的static函数相关推荐

  1. c语言静态变量存在堆还是栈,c 类 static 函数 什么样是静态变量?嵌入式C语言的堆栈管理如何实现...

    C语言中静态变量是什么意思,有什么作用,static在数据类型前面表示什么 最近刚看了C存储类的章节.所以来说说. C语言为变量提供了⑤种不同的存储模型,或者说是存储类. ①个变量可以用存储时期描述, ...

  2. C语言中的 static 函数

    整理来自CSDN.这些内容在书本上学习到,而在实际应用时会比较模糊或被忽视. 一.C程序一直由下列部分组成: 正文段--CPU执行的机器指令部分:一个程序只有一个副本:只读,防止程序由于意外事故而修改 ...

  3. C语言中的 static变量、static函数

    Static variable & function 1.Static variable 2.静态局部变量(static local variable) 3.静态全局变量(static glo ...

  4. C语言中的 static变量(全局和局部)、static函数总结

    简介: C语言中的 static变量(全局和局部).static函数总结 文章目录 本博文的简述or解决问题? 同步博文: static 变量: 静态局部变量: 静态全局变量: static 函数-. ...

  5. c语言中函数static变量,[转]C语言中的 static变量、static函数

    1. static 变量 静态变量的类型 说明符是 static. 静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量. 例如外部变量虽属于静态 存储方式,但不一定是静态变量, ...

  6. C语言:static作用(修饰函数、局部变量、全局变量)

    C语言:static作用(修饰函数.局部变量.全局变量) 一. static全局变量与普通的全局变量有什么区别 ? 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量.  全局变 ...

  7. C语言如何引用别的文件中的static函数

    文章目录 C如何引用别的文件中的static函数 如果是static函数呢? 缺点是我必须在haha中使用my_static,有时候你可能不想立即使用my_static 试验一下 这样就可以在主函数中 ...

  8. c语言中 允许函数重载么,简述C++语言支持函数重载问题介绍

    对于C++语言作为一种欲与C兼容的语言,C++语言保留了一部分过程式语言和特点,foo_int_int这样的名字包含了函数名.函数参数数量及类型信息,C++语言就是靠这种机制来实现函数重载的. 因而它 ...

  9. c++和c语言中的函数相互调用的问题

    1.如何C++程序要调用 已编译后的C函数,该怎么办? (1)假设某个C函数的声明如下: void foo(int x, int y); 该函数被C编译器编译后在库中的名字为_foo,而C++编译器则 ...

最新文章

  1. python3学习笔记(9)_closure
  2. mysql---CV出现的中英文符号错误
  3. 1,日志组件XLog
  4. warning: mysql-community-libs-5.7.11-1.el7.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID 5072e1f5
  5. C++ std::map 和 std::unordered_map 区别 时间复杂度 适用
  6. 【Java练习题】Java 程序的输出 | 第十一套(含解析)
  7. Datalogic得利捷发布Android企业级前沿应用程序——OEMConfig, 并推出2019中国零售博览会展品系列
  8. 防火墙结构之屏蔽主机体系结构
  9. Linux文本处理三剑客之grep
  10. 增长黑客,创业公司的用户与收入增长秘籍
  11. seqkit根据基因id_基因家族分析保姆级教程(分子进化)-生信小白自学之路
  12. 图像滤镜艺术---(Sketch Filter)素描滤镜
  13. 一份不太简短的LaTeX2e介绍最新版地址2019 The Not So Short In­tro­duc­tion To LATEX (Chi­nese Edi­tion)
  14. jOOQ是如何设计事务API(详细指南)
  15. 【人工智能大作业】A*和IDA*搜索算法解决十五数码(15-puzzle)问题 (Python实现)(启发式搜索)
  16. Qt 框架性开发实践——基础框架篇
  17. SqlServer循环执行存储过程
  18. 有什么技能是研究生必学的?
  19. 3DSMAX渲染被铁链束缚的花朵-3D建模教程
  20. 【WEB基础】HTML CSS 基础入门(9)CSS盒子

热门文章

  1. FFMPEG输出MP3
  2. Mac怎么取消Idea中Ctrl加左键等于右键
  3. 在手机上安装linux系统
  4. 单目标优化:猎豹优化算法(The Cheetah Optimizer,CO)求解cec2020(提供Matlab代码)
  5. Struts2表单验证
  6. photoshop怎么扣电子签名/抠图
  7. 前端HTML空格转义符总结
  8. 魅蓝E2上手评测:千元神机 续航怪兽
  9. 如何在 Word 2010 中给公式自动编号?
  10. 飞鸽传书不能使用的问题