error:“initializer element is not constant” (gcc和g++编译器的关系)

本文详细分析了在使用gcc/g++编译时遇到'initializer element is not constant'错误的原因,指出全局变量和静态变量初始化必须为常量表达式。同时,探讨了gcc和g++的编译区别,如gcc如何根据文件后缀名判断语言类型,并解释了为何g++可以处理c++代码中的全局变量初始化。此外,还介绍了编译器的强符号和弱符号概念,以及C为何要求全局变量和静态变量的初始值为常量表达式。
摘要由CSDN通过智能技术生成

1、首先解决标题所示的报错问题;

 

看下面一段代码:

#include <stdio.h>  
int a = 1;  
int b = 2;  
int c = a+b;  
  
int main() {  
    printf("c is %d\n", c);  
    return 0;  
}  

gcc -o test test.c 编译时出现错误:initializer element is not constant

 

原因:全局变量c的值不能在编译时确定,要在执行是确定(编译原理。。)为什么呢?因为这是标准:

C语言标准:全局变量(external variable)和静态变量 (static variable)的初始化式必须为常量表达式[1]

所以解决办法:

#include <stdio.h>  
int a = 1;  
int b = 2;  
int c; //只声明  
  
int main() {  
    c = a + b; //在main函数里赋值  
    printf("c is %d\n", c);  
    return 0;  
}

 

----------

同理,下面一段代码也编译不过去,报错信息和上面的一样:[4]

char * p1 = (char *) malloc(10);  
int main(void)
{
。。。   
}

 

 

 

2、gcc和g++到底是根据文件的后缀名来编译的吗?

 

在1的基础上,再往下思考一步,如果把源文件名 *.c 改为*.cc,然后使用g++编译,就不会报错,甚至仅仅只是把文件名改为*.cc,编译器还使用gcc编译,同样能够编译过去,那原因到底是什么呢?

 

--------------

原理:

①gcc 最开始的时候是 GNU C Compiler, 如你所知,就是一个c编译器。但是后来因为这个项目里边集成了更多其他不同语言的编译器,GCC就代表 the GNU Compiler Collection,所以表示一堆编译器的合集。 

所以现在在编译代码时调用的gcc,已经不是当初那个c语言编译器了,更确切的说他是一个驱动程序,根据代码的后缀名来判断调用c编译器还是c++编译器 (g++)。比如你的代码后缀是*.c,他会调用c编译器还有linker去链接c的library。如果你的代码后缀是cpp, 他会调用g++编译器,当然library call也要使用c++版本的(但是,gcc命令不能自动和c++程序使用的库链接,必须跟上参数gcc -lstdc++)

 

-----------------

有这么一段代码:

  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值