[英]GCC weak attribute on constant variables
我有一個關於 const 變量的弱屬性的問題。 我有以下幾個用 gcc 編譯的文件:
主文件:
#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
由於我使用的是弱屬性my_var
main.c中的變量我認為它應該是被覆蓋由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
放在文件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)
提前致謝,
我面臨着同樣的問題(參見弱常量變量GCC優化錯誤),並得出結論,提出了gcc
沒有處理好對優化weak
/ const
凡弱定義在文件中的變量:在你的“主。 c' 文件, my_var
總是解析為100
。
不確定,但它似乎是一個gcc
錯誤(?)。
要解決此問題,您可以:
gcc
添加-O0
選項來防止優化。
-O0
應該是默認值,所以這可能無濟於事......const
關鍵字: gcc
不能再優化了,因為my_var
現在可能會改變。const int my_var __attribute__((weak)) = 100;
單獨源文件中的語句(例如“main_weak.c”):在構建“main.c”時, gcc
不知道my_var
值,因此不會優化。標識符具有內部鏈接。 這是一個過時的特性(應該使用static
存儲類說明符)。 通常,您應該有一個帶有標識符的extern
聲明的標頭:
extern const int my_var;
與不同的限定符鏈接是一個壞主意。
也許更好理解的方法是使用wekref
加上alias
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.