强弱符号 - > double to char数组

时间:2016-02-27 01:33:04

标签: c pointers types linker symbols

我正在尝试更多地了解链接,更具体地说,如果强符号具有相同的名称,它们如何覆盖弱符号。我看到了一个例子,但没有答案,我一直坚持下去。

file1.c

char a[5];

int main() { printf("%s", a); }

file2.c中

double a = ???????;

如何在file2.c中设置一个,以便链接器将其解释为char数组并输出" hello"什么时候编译和执行这两个文件?

1 个答案:

答案 0 :(得分:1)

正如@ user3386109所指出的,没有strong v。weak符号的概念 标准C.一些编译器通过非标准支持这些概念, 不可移植的语言扩展。

例如,GCC支持弱符号 non-standard declaration syntax

__attribute__((weak)) <normal_declaration>

preprocessor pragma

#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)生成弱符号 引擎盖下,例如,以应对公共内联功能的链接。 他们以高度监管和专业的方式这样做。一旦你理解了弱符号,就尽力避免它们。