静态函数问题
本帖最后由 garyv 于 2011-06-03 11:49 编辑
头文件comm.h
- #ifndef __COMM_H__
- #define __COMM_H__
- static /*inline*/ int get_val(void)
- {
- return 3;
- }
- #endif
复制代码C文件a.c
- #include <stdio.h>
- #include <comm.h>
- void func(void);
- int main(int argc, char *argv[])
- {
- func();
- printf("%d\n", get_val());
- return 0;
- }
复制代码C文件b.c
- #include <stdio.h>
- #include <comm.h>
- void func(void)
- {
- printf("func: %d\n", get_val());
- }
复制代码gcc -o app a.c b.c竟然通过了连一个警告都没有,但是我认为,函数get_val()是一个static函数,而且头文件中加了防止重复编译宏定义,那边在编译第2个c文件时应该不会展开comm.h的,也就没有定义get_val()函数才对,但是编译是正常的!求解释
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
编译是先各自编译成模块再链接的。所以comm.h会在各个文件中展开。因为定义成static,所以模块不会导出符号,所以链接时不会出现重复定义的错误。
回复 2# liwangli1983
如果你说的是对的,那么comm.h里面的宏定义#ifndef... #define... #endif这些就不起作用了,这个宏每次都没有定义?
这些是防止对单个编译模块同一头文件多次包含的。比如头文件a.h包括了b.h,而你的C文件包括了a.h,又再次包括了b.h,#ifdef这些就起作用了。
始终要记住一点,编译是单个编译模块(或者说C文件)独立进行的。编译成目标模块后再链接成整个可执行文件。