我有一個關於const變量弱屬性的問題。我有以下幾個文件,用gcc編譯:常量變量的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);
}
other.c:
const int my_var = 200;
當我編譯這兩個文件並運行應用程序我得到的結果如下:由於我在main.c中使用弱屬性上my_var
變量
my_var = 100
我壽ught應該由my_var
變量other.c
被覆蓋,但事實並非如此......
現在,如果我在main.c
下降的my_var
的const
關鍵字:
#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
關鍵字改變weak
屬性的行爲:如果我的文件other.c
中刪除const
我仍然得到的200
我的問題是,結果呢?它與變量駐留在哪一部分有關?
我使用的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
@LPs:它適用於兩者。只有描述在函數屬性中,var-attributes只是指tothat。 – Olaf
您可能需要使用-fno-common編譯才能正常工作。 – fuz