| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3501 人关注过本帖
标题:为什么linux双链表的函数实现写在头文件里?
只看楼主 加入收藏
八画小子
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:37
帖 子:709
专家分:2063
注 册:2010-11-11
收藏
得分:0 
以下是引用花脸在2018-6-21 20:39:43的发言:

static的含义:
static修饰一个函数,则这个函数的只能在本文件中调用,不能被其他文件调用。
static修饰全局变量的时候,这个全局变量只能在本文件中访问,不能在其它文件中访问,即便是extern外部声明也不可以。  
我的意思是加上#program once 就不用加static
自己弄懂就好,但别误导别人。“我的意思是加上#program once 就不用加static”几乎没人用这种用法。static是语法层面的东西,#program是编译器层面的东西。
2018-06-21 20:44
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
收藏
得分:0 
回复 11楼 八画小子
恩好的 谢谢。
2018-06-21 20:50
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
收藏
得分:0 
以下是引用花脸在2018-6-21 20:39:43的发言:

static的含义:
static修饰一个函数,则这个函数的只能在本文件中调用,不能被其他文件调用。
static修饰全局变量的时候,这个全局变量只能在本文件中访问,不能在其它文件中访问,即便是extern外部声明也不可以。
我的意思是加上#program once 就不用加static

错的
首先 #program once 实现定义
换一个编译器可能就没有这个预编译指令
static 和 #program once 功能上没什么关联
#program once 和 #ifndef常见用法 一个作用
static这里是限制文件作用域的标识符没有外部链接的效果
不管是#program once 还是 #ifndef 都无法做到这一点
加了 #program once 不加 static 一样会报错

https://zh.
2018-06-22 00:32
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
收藏
得分:0 
以下是引用八画小子在2018-6-21 20:31:12的发言:

楼主问的问题和有没有inline没关系。

是加了static,但如果我两个c文件里都包含了这个头文件,编译时岂不是被编译两次,生成两段一样的代码》

题主问 是不是会编译两次生成一样的代码
我回答 有加inline 不用考虑这个问题
有问题吗?

https://zh.
2018-06-22 09:51
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
其实,在没有加static的情况下也可以直接引用,头文件就是简单的复制粘贴,弄清楚函数的作用域就可以了,当然头文件里面的变量不加static就是公共的了,就相当于一个全局变量~

其实楼主所说的多个.c,如果加了static引用同一个头文件的确会生成重复的代码,但加了static变量间(如果有变量的话……其实通常没事不会把一个变量写进头文件里面的)不会发生冲突,更何况.h里面通常只有函数的定义而没有实体函数,所以多个.c引用同一个头文件就是说多个.c都能够使用.h里面声明的那些函数而已~

但看了的确会有简化编译处理而把函数实现主体写进.h里面的情况,"list.h"就是一个例子~但加了就像楼上有说加了inline关键字会直接把实现主体代码会在调用函数的时候直接展开,因此不用考虑是否生成重复代码这是有一定的道理的(其实用inline多次调用同一个函数已经有重复的代码了)

如果不打算生成重复的代码,就用接口分离吧(简单说就是.h是函数接口,函数实现主体在.c里面),那样函数实现主体只会被编译一次,但对于"list.h"的系统提供头文件来说,把它实现接口分离不怎么现实而且没啥实用性,所以如果要让多个.c要同时引用"list.h"的话,直接用就可以了,没问题的

其实,出现因为多文件编译发生错误的情况通常是同一个头文件里面的定义在其作用域范围内重复定义了一次,这种情况可以用#ifndef或者#pragma once来解决,而和多个.c文件引用而发生的问题无关,至于是否生成重复的编码对于"list.h"而言是一个不用考虑的问题~

[此贴子已经被作者于2018-6-22 15:55编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-06-22 15:31
八画小子
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:37
帖 子:709
专家分:2063
注 册:2010-11-11
收藏
得分:0 
以下是引用lin5161678在2018-6-22 09:51:39的发言:

 
 
题主问 是不是会编译两次生成一样的代码  
我回答 有加inline 不用考虑这个问题
有问题吗?
inline这东西,个人感觉不好控制最终的编译结果。是否真的要inline,是要看具体实现的。或许你想要inline的时候,编译器却没有inline。
2018-06-23 08:21
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
以下是引用八画小子在2018-6-23 08:21:08的发言:

inline这东西,个人感觉不好控制最终的编译结果。是否真的要inline,是要看具体实现的。或许你想要inline的时候,编译器却没有inline。



曾经试过用inline写递归,哇,竟然可以通过编译,后来我才知道这是一个问题~

但既然楼主说是用系统头文件,那应该是经过严格测试才发布的,所以inline应该没有问题,不然那不成笑话么~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-06-23 09:59
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
收藏
得分:0 
回复 16楼 八画小子
"linux双链表的函数实现写在头文件"
你觉得写这段代码的人 没搞懂会不会 inline ?

https://zh.
2018-06-23 16:04
八画小子
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:37
帖 子:709
专家分:2063
注 册:2010-11-11
收藏
得分:0 
以下是引用lin5161678在2018-6-23 16:04:27的发言:

"linux双链表的函数实现写在头文件"
你觉得写这段代码的人 没搞懂会不会 inline ?

写linux内核源代码的人会,但其他个别人就不好说了。
2018-06-24 17:19
快速回复:为什么linux双链表的函数实现写在头文件里?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.529621 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved