作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试了解有关链接的更多信息,更具体地说,如果强符号具有相同的名称,则强符号如何覆盖弱符号。我看到了一个例子,但没有答案,我一直被困在上面。
文件1.c
char a[5];
int main() { printf("%s", a); }
文件2.c
double a = ???????;
如何在 file2.c 中设置 a ,以便链接器将其解释为字符数组,并在编译和执行这两个文件时输出“hello”?
最佳答案
正如@user3386109所指出的,不存在strong
与weak
符号的概念在标准 C 中。一些编译器通过非标准支持这些概念,不可移植的语言扩展。
例如,GCC 支持弱符号 non-standard declaration syntax :
__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)
在实际应用中,使用弱符号会出现链接问题,由此,即使强定义也可用,也可以链接弱符号定义。编译器(包括微软的)生成弱符号例如,在幕后处理公共(public)内联函数的链接。他们以高度监管和专业的方式做到这一点。一旦理解了弱符号,就尽力避免使用它们。
关于c - 强弱符号 -> double 转 char 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35664651/
我是一名优秀的程序员,十分优秀!