如何找出为什么gcc和g ++产生不同的代码

Mik*_*kov 3 c c++ compiler-construction gcc

是否有可能看到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;
}
Run Code Online (Sandbox Code Playgroud)

使用gcc时出错时,为什么用g ++生成二进制文件而不出错?
我正在寻找一种方法来追踪使它们表现不同的方法.

# gcc test.c -o test_app
test.c:7:1: error: initializer element is not constant
# g++ test.c -o test_app
Run Code Online (Sandbox Code Playgroud)

我认为原因可能是gcc使用cc1作为编译器而g ++使用cc1plus.
有没有办法更准确地输出实际做的?
我试过使用-v标志,但输出非常相似.是否有不同的标志传递给链接器?
比较两个编译过程并发现其中的差异的最简单方法是什么?

use*_*342 10

在这种情况下,gcc因为程序无效而不产生任何内容.正如编译器所解释的那样,初始化元素(用于初始化全局变量的表达式arr)不是常量.

C要求初始化表达式是编译时常量,以便局部变量的内容可以放在可执行文件的数据段中.这是不可能的,arr因为所涉及的变量的地址在链接时间之前是未知的,并且它们的总和不能由动态链接器简单地填充,如同情况那样addr1.C++允许这样做,因此g++生成初始化代码,用于计算非常量表达式并将它们存储在全局变量中.此代码在调用之前执行main().

可执行文件cc1cc1plus是编译器的执行的内部细节,并且因此无关的观察到的行为.相关的事实是gcc期望有效的C代码作为其输入,并g++期望有效的C++代码.您提供的代码是有效的C++,但不是有效的C,这就是为什么g++编译它而gcc不是.