簡體   English   中英

常量變量的 GCC 弱屬性

[英]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.cmy_varconst關鍵字:

#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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM