2016-03-18 31 views
1

我有一個關於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_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關鍵字改變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) 

由於提前,

+0

AFAIK弱屬性用於功能。 – LPs

+0

@LPs:它適用於兩者。只有描述在函數屬性中,var-attributes只是指tothat。 – Olaf

+1

您可能需要使用-fno-common編譯才能正常工作。 – fuz

回答

0

標識符具有內部鏈接。這是一個過時的功能(應使用static存儲類說明符)。在一般情況下,你應該有一個頭與extern聲明標識符:

extern const int my_var; 

不同預選賽鏈接是一個壞主意。

也許更好的理解方法是使用wekrefalias

+0

你對頭文件是正確的,我沒有把它添加到我在這裏寫的例子,但是,它並沒有改變現象:使用'const'就像取消弱屬性一樣。 我的問題是:爲什麼當我放棄'const'限定符它按預期工作? 另一個問題:當你說這是一個笨拙的功能時,你是否提到弱變量? 謝謝 – user6083108

+0

@ user6083108:C標準甚至沒有提及'__attribute__',甚至更不「弱」。請注意,gcc的'weak'屬性實際上是指爲變量生成的**符號**(即鏈接器/彙編語言,而不是C)。 C變量具有類型等附加屬性。 「weak」屬性實際上爲符號添加了低於C語言的屬性。沒有冒犯性,但我可以推薦對這個(相當複雜的)主題做更多的研究嗎?也許你真的使用'weakref'更好。對我而言,這比「弱」在全球範圍內的作用更明確。 – Olaf

+0

陳舊過時:在這種情況下,我沒有提到「弱」。 – Olaf