2014-05-15 130 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那永远不会被优化。