我正在尝试更多地了解链接,更具体地说,如果强符号具有相同的名称,它们如何覆盖弱符号。我看到了一个例子,但没有答案,我一直坚持下去。
file1.c
char a[5];
int main() { printf("%s", a); }
file2.c中
double a = ???????;
如何在file2.c中设置一个,以便链接器将其解释为char数组并输出" hello"什么时候编译和执行这两个文件?
答案 0 :(得分:1)
正如@ user3386109所指出的,没有strong
v。weak
符号的概念
标准C.一些编译器通过非标准支持这些概念,
不可移植的语言扩展。
__attribute__((weak)) <normal_declaration>
#pragma weak <symbol>
对于GCC,你想要的一个例子是:
<强> file1.c中强>
#include <stdio.h>
char a[] = "Hello World";
extern double b;
int main(void)
{
printf("%s %f\n",a,b);
return 0;
}
<强> file2.c中强>
__attribute__((weak)) double a = 1.1;
double b = 2.2;
编译和链接:
$ gcc -o prog file1.c file2.c
执行命令
$ ./prog
Hello World 2.200000
如果删除__attribute__((weak))
并重建,则会有一个
多重链接错误。
微软编译器只支持“符号”支持弱符号声明
__declspec(selectany)
在实际应用中,使用弱符号存在联系问题, 即使在也可获得强定义时,弱符号定义也可以链接。编译器(包括Microsoft)生成弱符号 引擎盖下,例如,以应对公共内联功能的链接。 他们以高度监管和专业的方式这样做。一旦你理解了弱符号,就尽力避免它们。