srk*_*ing 2 c global-variables standards-compliance
C编译器是否可以假设两个不同的extern全局变量不能别名到同一个地址?
在我的情况下,我有这样的情况:
extern int array_of_int[], array_end;
void some_func(void)
{
int *t;
for (t = &array_of_int[0]; t != &array_end; t++)
{
...
通过优化编译生成的二进制文件不会测试
t != &array_end进入循环之前的条件.编译器的优化是循环必须至少执行一次,因为在开始时
t不能立即相等&array_end.
当然,我们发现这很难.显然,一些带有链接器部分的汇编程序hackery导致两个外部程序是相同地址的情况.
谢谢你的建议!
简而言之,是的,可以自由地做出这样的假设.extern变量没有什么特别之处.两个变量可能不是彼此的别名.(如果答案有所不同,请考虑随之而来的混乱. extern int a, b可能会互为别名,这会使使用这些变量的任何代码的语义完全疯狂!)
事实上,你在这里依赖于未定义的行为,完全停止.以这种方式比较不相关变量的地址是无效的.