大佬教程收集整理的这篇文章主要介绍了c – 如何找出gcc和g产生不同代码的原因,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
#include <stdio.h> #include <unistd.h> size_t sym1 = 100; size_t *addr = &sym1; size_t *arr = (size_t*)((size_t)&arr + (size_t)&addr); int main (int argc,char **argv) { (void) argc; (void) argv; printf("libtest: addr of main(): %p\n",&main); printf("libtest: addr of arr: %p\n",&arr); while(1); return 0; }
当使用gcc时出错时,为什么用g生成二进制文件而不出错?
我正在寻找一种方法来追踪使它们表现不同的方法.
# gcc test.c -o test_app test.c:7:1: error: initializer element is not constant # g++ test.c -o test_app
我认为原因可能是gcc使用cc1作为编译器而g使用cc1plus.
有没有办法更准确地输出实际做的?
我试过使用-v标志,但输出非常相似.是否有不同的标志传递给链接器?
比较两个编译过程并发现其中的差异的最简单方法是什么?
C要求初始化表达式是编译时常量,以便局部变量的内容可以放在可执行文件的数据段中.这不能用于arr,因为在链接时间之前不知道所涉及的变量的地址,并且动态链接器不能简单地填充它们的总和,就像addr1的情况一样. C允许这样,因此g生成初始化代码,用于计算非常量表达式并将它们存储在全局变量中.此代码在@L_70_22@main()之前执行.
可执行文件cc1和cc1plus是编译器实现的内部细节,因此与观察到的行为无关.相关的事实是gcc期望有效的C代码作为其输入,并且g期望有效的C代码.你提供的代码是有效的C,但不是有效的C,这就是为什么g编译它而gcc没有.
以上是大佬教程为你收集整理的c – 如何找出gcc和g产生不同代码的原因全部内容,希望文章能够帮你解决c – 如何找出gcc和g产生不同代码的原因所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。