- 论坛徽章:
- 0
|
本帖最后由 zodiac1111 于 2013-06-11 23:26 编辑
以下皆为有限的水平下的个人见解,不提供任何担保.
简而言之:使用头文件分离声明和实现可以有效避免这种"错误"的发生.
这种情况,
* main中的foo函数只有声明没有实现,是一个<del>弱符号</del>.(update:这是错误的,概念范畴不同).
* func.c中的foo函数是一个强符号.
即使两者声明的形式完全一致,如都声明为 int function(int arg1, int arg2),
那么也是调用func.c中的函数(强符号). [也可能是gcc(c语言)编译器生成的符号没有包含参数列表的标志,所以形成了同名的符号,g++不知道什么情况]
同个程序可以有0个至多个弱符号,但不能有多与一个的(同名)强符号.不然就会ld就会抱怨"重复定义blabla.."
而若有多个弱符号没有强符号,则跟链接(link)的顺序有关.先到先得[测试1].
# 关键词:
强符号,弱符号.weak symbol
# 参考:
* http://www.trueeyu.com/?p=855
* http://en.wikipedia.org/wiki/Weak_symbol
* http://gcc.gnu.org/onlinedocs/gcc-3.2/gcc/Function-Attributes.html weak
# 测试1(弱符号的调用顺序):
如下2个文件:
- /* main.c */
- int foo(int arg1 )__attribute__((weak));
- int foo(int arg1)
- {
- printf("foo in mian.c\n");
- return 0;
- }
- int main(void)
- {
- foo(1);
- return 0;
- }
复制代码- /* func.c */
- int foo(int arg1,int arg2)__attribute__((weak));
- int foo(int arg1,int arg2)
- {
- printf("foo in func.c\n");
- return 0;
- }
复制代码
编译:
- gcc main.c func.c -o main1
- gcc func.c main.c -o main2
复制代码
运行:
- [fly][zodiac1111@fc tmp]$ ./main1
- foo in mian.c
- [zodiac1111@fc tmp]$ ./main2
- foo in func.c[/fly]
复制代码
-- update --
更新基础知识错误 |
|