static函数的作用是在链接层面上

http://yonghaowu.github.io/Blog/static_function/ Md格式,原地址阅读体验更佳。

先摆干货,总结:static函数的作用是在链接层面上的。

  1. 正如很多C语言书籍里都有提到:

    函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用。 定义静态函数的好处: <1> 其他文件中可以定义相同名字的函数,不会发生冲突 <2> 静态函数不能被其他文件所用。

    基于此,我做了两个测试。

    1. A.h里直接有a函数,static b函数的定义,a函数调用了b函数。 然后B.c #include A.h, 调用a, 没有问题。
    2. A.h里有a , static b函数的声明,A.c里才定义a和b函数,也是a函数调用了b函数。 然后B.c #include A.h, 调用a, 报错,在B.c中b函数是undefined reference

    当出现这样的结果时,我以前对static函数的认知是2里的作用;而在1里,static失去它原来的作用,变得可有可无,就是没有也是可以的。对此,我再举一个例子来说明:

    B.c文件里引用了A.h, A.h有一个定义了的haha()函数,haha函数就是一个在A.h里面其他函数的helper,声明了为static,不想被其他文件调用,出现命名冲突。 但是B.c自己本身也定义了一个haha函数,那么就会有冲突了。那么static就起不到作用。

    但如果是按照2的方式,声明与定义分开,就没有这个问题。我做过测试,是可以这样,调用的是B.c自己的haha, 而把static删去后,就会报错重定义。

    后来QianHong点出了问题所在, 反驳了我“可有可无”的观点

    在1的方式中 加入B.c 编译为 B.o, C.c 编译为 C.o 然后 B.o 和 C.o 再合起来链接为 ./binary 如果没有在A.h 对 b函数使用 static 关键字 那么 C.c (C.o) 里就不可以定义一个新的 b 函数 如果 A.h 对 b函数使用了 static 关键字 那么 C.c(C.o) 里就可以定义另一个 b 函数 C.c刻意不include A.h


可知,1中的static是在链接层面上的。而我们一般的理解则是2中的。

时间: 2024-11-09 00:45:12

static函数的作用是在链接层面上的相关文章

18-C语言static和extern关键字1-对函数的作用

一.extern与函数 在第三讲和第四讲中,我提到过一句话:如果一个程序中有多个源文件(.c),编译成功会生成对应的多个目标文件(.obj),这些目标文件还不能单独运行,因为这些目标文件之间可能会有关联,比如a.obj可能会调用c.obj中定义的一个函数.将这些相关联的目标文件链接在一起后才能生成可执行文件. 先来理解2个概念: 外部函数:如果在当前文件中定义的函数允许其他文件访问.调用,就称为外部函数.C语言规定,不允许有同名的外部函数. 内部函数:如果在当前文件中定义的函数不允许其他文件访问

15-static和extern关键字1-对函数的作用

一.extern与函数 如果一个程序中有多个源文件(.c),编译成功会生成对应的多个目标文件(.obj),这些目标文件还不能单独运行,因为这些目标文件之间可能会有关联,比如a.obj可能会调用c.obj中定义的一个函数.将这些相关联的目标文件链接在一起后才能生成可执行文件. 先来理解2个概念: 外部函数:如果在当前文件中定义的函数允许其他文件访问.调用,就称为外部函数.C语言规定,不允许有同名的外部函数. 内部函数:如果在当前文件中定义的函数不允许其他文件访问.调用,只能在内部使用,就称为内部函

【学习笔记】【C语言】static和extern对函数的作用

如果一个程序中有多个源文件(.c),编译成功会生成对应的多个目标文件(.obj),这些目标文件还不能单独运行,因为这些目标文件之间可能会有关联,比如a.obj可能会调用c.obj中定义的一个函数.将这些相关联的目标文件链接在一起后才能生成可执行文件. 外部函数:如果在当前文件中定义的函数允许其他文件访问.调用,就称为外部函数.C语言规定,不允许有同名的外部函数.内部函数:如果在当前文件中定义的函数不允许其他文件访问.调用,只能在内部使用,就称为内部函数.C语言规定不同的源文件可以有同名的内部函数

【黑马程序员】————static和extern关键字1-对函数的作用

一.extern与函数 如果一个程序中有多个源文件(.c),编译成功会生成对应的多个目标文件(.obj),这些目标文件还不能单独运行,因为这些目标文件之间可能会有关联,比如a.obj可能会调用c.obj中定义的一个函数.将这些相关联的目标文件链接在一起后才能生成可执行文件. 先来理解2个概念: 外部函数:如果在当前文件中定义的函数允许其他文件访问.调用,就称为外部函数.C语言规定,不允许有同名的外部函数. 内部函数:如果在当前文件中定义的函数不允许其他文件访问.调用,只能在内部使用,就称为内部函

转:从编译链接过程解析static函数的用法

关于static函数的用法

学习笔记之19-static和extern关键字1-对函数的作用

一.extern与函数 曾提到过一句话:如果一个程序中有多个源文件(.c),编译成功会生成对应的多个目标文件(.obj),这些目标文件还不能单独运行,因为这些目标文件之 间可能会有关联,比如a.obj可能会调用c.obj中定义的一个函数.将这些相关联的目标文件链接在一起后才能生成可执行文件. 先来理解2个概念: 外部函数:如果在当前文件中定义的函数允许其他文件访问.调用,就称为外部函数.C语言规定,不允许有同名的外部函数. 内部函数:如果在当前文件中定义的函数不允许其他文件访问.调用,只能在内部

【C语言】19-static和extern关键字1-对函数的作用

本文目录 一.extern与函数 二.static与函数 三.static.extern与函数的总结 说明:这个C语言专题,是学习iOS开发的前奏.也为了让有面向对象语言开发经验的程序员,能够快速上手C语言.如果你还没有编程经验,或者对C语言.iOS开发不感兴趣,请忽略 上一讲中大致介绍了变量的类型,不同类型的变量有不同的存储类型.不同的生命周期.不同的作用域.这讲介绍2个比较重要的关键字:static和extern. static和extern不仅可以用在变量上,还可以用在函数上.这讲先介绍它

C语言 19-static和extern关键字1-对函数的作用

本文目录 一.extern与函数 二.static与函数 三.static.extern与函数的总结 说明:这个C语言专题,是学习iOS开发的前奏.也为了让有面向对象语言开发经验的程序员,能够快速上手C语言.如果你还没有编程经验,或者对C语言.iOS开发不感兴趣,请忽略. 上一讲中大致介绍了变量的类型,不同类型的变量有不同的存储类型.不同的生命周期.不同的作用域.这讲介绍2个比较重要的关键字:static和extern. static和extern不仅可以用在变量上,还可以用在函数上.这讲先介绍

C++学习---static 有什么作用?

static 有什么作用? 面试的时候,很容易问到的基础性问题,也是最容易被大家忽略的问题. 一.static 修饰 类的成员变量 在class 里面出现一个变量, 比如 : class Example { public: static int a; ... }; 一个成员变量加了static, 那么这个static成员变量是属于整个类的,而不是某个对象.存放的位置呢,也跟普通变量有了区别: 普通成员变量,存放在stack里面,每个实例化的对象的成员变量,单独保存各自的数据. static成员变