【问题标题】:Strong weak symbol -> double to char array [closed]强弱符号->双字符数组[关闭]
【发布时间】:2016-02-27 01:33:03
【问题描述】:

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

file1.c

char a[5];

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

file2.c

double a = ???????;

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

【问题讨论】:

  • char[5] a; 不是有效的 C 语法。而你似乎尝试调用未定义的行为。您实际上想要完成什么?你想这样做的原因是什么?
  • 您的问题不清楚。添加指向您看到的示例的链接可能会有所帮助。请注意,尽管强符号和弱符号可能是链接器功能(可能对汇编代码有用),但 C 中没有这样的概念。因此您需要解释您希望该功能做什么。

标签: c pointers types linker symbols


【解决方案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)) 并重建,将会有一个 多定义联动错误。

Microsoft 编译器仅“某种程度”支持弱符号声明 __declspec(selectany)

在实际应用中,存在使用弱符号的链接陷阱, 因此,即使强定义也可用,也可以链接弱符号定义。编译器(包括微软的)生成弱符号 在引擎盖下,例如处理公共内联函数的链接。 他们以高度规范和专业的方式这样做。一旦你理解了弱符号,就尽量避开它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-03
    • 1970-01-01
    • 2019-09-24
    • 2018-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多