1. Weak Symbol 测试验证完整过程
在C/C++混合编程中,弱符号(Weak Symbol)是一个容易被忽视但极其重要的概念。它允许我们在链接阶段灵活地选择函数实现,这在库开发、插件系统和跨语言交互等场景中尤为实用。今天我将通过一个完整的实验,带大家深入理解weak symbol的工作机制。
1.1 测试目标与背景知识
我们主要验证以下场景:
- 在C文件(
a.c)中定义带有weak属性的函数 - 在C++文件(
b.cpp)中提供该函数的强符号版本 - 观察最终调用的是weak函数还是强函数
这里涉及两个关键概念:
- 强弱符号:强符号指明确定义的函数/变量,弱符号则是可能被覆盖的"备胎"实现
- 名称修饰(Name Mangling):C++编译器为了支持函数重载,会对函数名进行编码
重要提示:C语言默认不支持函数重载,因此不会对函数名进行修饰;而C++必须通过名称修饰来区分重载函数。
1.2 第一版代码实现
1.2.1 a.c 文件实现
c复制#include <stdio.h>
// 声明weak函数
__attribute__((weak)) void my_func() {
printf("This is WEAK implementation in C\n");
}
// 测试函数
void test_call() {
printf("Calling function...\n");
my_func();
}
1.2.2 b.cpp 文件实现
cpp复制#include <iostream>
// 提供强符号实现
void my_func() {
std::cout << "This is STRONG implementation in C++" << std::endl;
}
1.2.3 编译与链接
bash复制gcc -c a.c -o a.o
g++ -c b.cpp -o b.o
g++ a.o b.o -o test
1.3 关键发现与问题分析
执行测试程序后,我们观察到一个有趣现象:
- 当b.cpp提供强符号时,输出的是C++版本实现
