免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3620 | 回复: 2
打印 上一主题 下一主题

.h中定义的static函数能不能取代inline呢? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-26 18:37 |只看该作者 |倒序浏览
我一直都用C++编译器的,现在开始用纯C写点东西,遇到不少问题,请教下大家,先谢谢。
   
   我这现在有个宏

#define RX_GET_ELEM(ptr, elem_size, n) ((void*)((rx_byte*)ptr + ((n) * elem_size)))

我确实不太喜欢这种容易出错的东西用宏

我对static函数的理解就是在单独的编译单元内生成一份copy,所以链接时候两个同样的编译单元出现同样的符号就没问题了,例如
a.c和b.c内都定义了
static void test() { int x = 0; }
那么链接时候是不会出问题的。

但是我现在的做法是再一个公用的头文件内(例如:rx_misc.h)声明并定义
static void* RX_GET_ELEM(void *ptr, size_t elem_size, size_t idx)
{
                return ((void*)((rx_byte*)ptr + ((idx) * elem_size)));
               
}

我之所以认为它们可以取代inline的做法是因为一般编译器做函数展开的前提是此函数的定义在编译单元内可见,例如我这个在头文件上定义的函数就是这样的,vc8也确实可以做优化。

请问这样做是不是可行的?

btw:因为我不用inline的目的也是希望它们在编译器间移植
     即使编译器不能做优化,至少它应该保证我这么定义永远是可以编译通过的

[ 本帖最后由 Solidus 于 2008-1-26 18:44 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-01-26 18:51 |只看该作者
只要在包含这个头文件的源文件中没有定义相同的函数,编译就不会出错,但是编译器是否在调用这个函数的地方扩展该函数则取决于优化了,跟标准相差就远点了。

论坛徽章:
0
3 [报告]
发表于 2008-01-28 20:10 |只看该作者

回复 #1 Solidus 的帖子

如果声明为static,在每个包含rx_misc.h的.c文件中都会定义有一个RX_GET_ELEM函数,连接的时候就会出现“重定义”错误。
声明为static之后,RX_GET_ELEM对外是不可见的,所以连接可以顺利通过。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP