2014-05-15 213 views
0

我正在使用-O2標誌編譯我的程序,我發現忽略了某個變量的屬性。爲什麼會這樣,我該如何強制它接受這個屬性?gcc:警告:忽略'used'屬性

extern const int my_var __attribute__((used)); // but my_var is not actually 
               // used in this file, but I'd 
               // like it to be included in 
               // the symbol table 

warning: 'used' attribute ignored 

回答

2

__attribute__((__used__))只會使上static對象或函數定義感,並告訴編譯器產生的定義,即使它似乎並沒有被所有引用,在這種情況下,通常會被完全優化掉。通過外部鏈接定義的對象永遠不會被優化(除非可能在整個程序模式或鏈接器/ LTO中)。但是你的用法甚至不是一個定義;這是一個外部對象的聲明。

如果你的目標確實很給力你的目標文件包含到這個外部符號的引用,即使它沒有使用,你可以這樣做:

extern const int my_var; 
static const int *const dummy __attribute__((__used__)) = &my_var; 

這將創建一個(沒用)參考my_var那永遠不會被優化。