我正在用-O2标志编译我的程序,我看到变量的属性被忽略了。为什么这样,我怎么强迫它接受属性?
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
答案 0 :(得分:5)
__attribute__((__used__))
仅对static
对象或函数定义有意义,并告诉编译器发出定义,即使它似乎根本没有被引用,其中它通常会完全优化。使用外部链接定义的对象永远不会被优化(除了可能在整个程序模式或链接器/ LTO中)。但你的用法甚至不是一个定义;它是外部对象的声明。
如果您的目标确实是强制您的目标文件包含对此外部符号的引用,即使它未被使用,您可以执行以下操作:
extern const int my_var;
static const int *const dummy __attribute__((__used__)) = &my_var;
这会创建一个(无用的)对my_var
的引用,该引用永远无法优化。