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++)
-----------------
有这么一段代码: