如何解决弱常量变量上的 GCC 优化错误
在不同优化级别(即 gcc
或 -O0
)上处理弱常量变量时,我遇到了奇怪的 -O1
行为。
代码如下:
def.h:声明
const int var;
int copy;
int do_copy(void);
weak.c:弱var
定义,do_copy
实现做copy = var
#include "def.h"
const int __attribute__((weak)) var = 1;
int do_copy(void)
{
copy = var;
return var;
}
main.c:强var
定义,以及do_copy
#include <stdio.h>
#include "def.h"
int copy = 0;
int copy2 = 0;
const int var = 2;
int main(void)
{
copy2 = do_copy();
printf("copy=%d,copy2=%d\n",copy,copy2);
return 0;
}
从这个“main.c”代码中,我期望 copy
和 copy2
都保留强大的 var
值,即 2
。
这是经过-O0
优化的输出:
$ gcc -O0 -c main.c -o main0.o
$ gcc -O0 -c weak.c -o weak0.o
$ gcc main0.o weak0.o -o main0
$ ./main0
copy=2,copy2=2
这是预期的结果。
这是经过-O1
优化的输出:
$ gcc -O1 -c main.c -o main1.o
$ gcc -O1 -c weak.c -o weak1.o
$ gcc main1.o weak1.o -o main1
$ ./main1
copy=1,copy2=2
这是意外:虽然copy2
确实保留了强值(2
),但copy
实际上被设置为弱值({{1} })!
在 'weak.c' 文件中,看起来 1
总是被评估为 var
。
我的看法是,当 1
被声明为 var
时,编译器认为它的值将始终为 const
并对整个文件进行优化(1
语句除外) )。因此,它忽略了弱/强的东西,并且不关心 'main.c' 中的强重定义!
问题可以通过以下方式解决:
- 在单独的文件中设置弱定义 (
return
),比如“weak2.c”。 - 不使
const int __attribute__((weak)) var = 1;
保持不变(这可能是不可接受的!):var
--->const int var;
。
这对我来说仍然是一个 int var;
错误,但我是否遗漏了什么?
附录:
这是gcc
的使用版本:
gcc
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。