【发布时间】:2016-03-18 15:07:29
【问题描述】:
我有一个关于 const 变量的弱属性的问题。我有以下几个用 gcc 编译的文件:
main.c:
#include <stdio.h>
const int my_var __attribute__((weak)) = 100;
int
main(int argc, char *argv[])
{
printf("my_var = %d\n", my_var);
}
其他.c:
const int my_var = 200;
当我编译这两个文件并运行应用程序时,我得到以下结果:
my_var = 100
由于我在 main.c 中的 my_var 变量上使用了弱属性,我认为它应该被 other.c 中的 my_var 变量覆盖,但事实并非如此......
现在如果我将my_var 的const 关键字放到main.c 中:
#include <stdio.h>
/* Dropping const... */
int my_var __attribute__((weak)) = 100;
int
main(int argc, char *argv[])
{
printf("my_var = %d\n", my_var);
}
然后重新编译,我得到了想要的结果:
my_var = 200
这是我所期望的。
注意:如果我将 const 放到文件 other.c 中,我仍然会得到 200 的结果。
我的问题是:为什么使用const 关键字会改变weak 属性的行为?是否与变量所在的部分有关?
我使用的 Makefile 是:
.PHONY: all clean
TARGET=test
OBJS=main.o other.o
all: $(TARGET)
$(TARGET): $(OBJS)
gcc $(OBJS) -o $(TARGET)
main.o:main.c
gcc -c main.c
other.o:other.c
gcc -c other.c
clean:
rm -rf *.o $(TARGET)
提前致谢,
【问题讨论】:
-
AFAIK 弱属性适用于函数。
-
@LPs:两者都适用。只有描述在functions属性中,var-attributes只是引用那个。
-
您可能需要使用 -fno-common 进行编译才能使其正常工作。
-
@Olaf 谢谢。他们的用法呢?例如。对于库,是否应该预先定义和初始化库需要由库用户定义的全局变量?这对我来说看起来很可怕......
-
@LPs:我目前仅将它们用于功能,但方法应该相同。我认为一般来说,使用
weakref加上别名是两种用法的更好方法。但是让它们成为全局符号(即外部链接)应该是第一阶段。
标签: c gcc attributes