当前位置:首页 » 编程语言 » c语言gcc

c语言gcc

发布时间: 2022-05-30 23:55:00

‘壹’ G++、GCC和c语言有区别吗

误区一:gcc只能编译c代码,g++只能编译c++代码
两者都可以,但是请注意:
1.后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序;后缀为.cpp的,两者都会认为是c++程序,注意,虽然c++是c的超集,但是两者对语法的要求是有区别的。C++的语法规则更加严谨一些。
2.编译阶段,g++会调用gcc,对于c++代码,两者是等价的,但是因为gcc命令不能自动和C++程序使用的库联接,所以通常用g++来完成链接,为了统一起见,干脆编译/链接统统用g++了,这就给人一种错觉,好像cpp程序只能用g++似的。

误区二:gcc不会定义__cplusplus宏,而g++会
实际上,这个宏只是标志着编译器将会把代码按C还是C++语法来解释,如上所述,如果后缀为.c,并且采用gcc编译器,则该宏就是未定义的,否则,就是已定义。

误区三:编译只能用gcc,链接只能用g++
严格来说,这句话不算错误,但是它混淆了概念,应该这样说:编译可以用gcc/g++,而链接可以用g++或者gcc -lstdc++。因为gcc命令不能自动和C++程序使用的库联接,所以通常使用g++来完成联接。但在编译阶段,g++会自动调用gcc,二者等价。

gcc和g++的区别


们在编译c/c++代码的时候,有人用gcc,有人用g++,于是各种说法都来了,譬如c代码用gcc,而c++代码用g++,或者说编译用gcc,链接
用g++,一时也不知哪个说法正确,如果再遇上个extern "C",分歧就更多了,这里我想作个了结,毕竟知识的目的是令人更清醒,而不是更糊涂。
误区一:gcc只能编译c代码,g++只能编译c++代码

两者都可以,但是请注意:
1.后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序;后缀为.cpp的,两者都会认为是c++程序,注意,虽然c++是c的超集,但是两者对语法的要求是有区别的,例如:
#include
int main(int argc, char* argv[]) {
if(argv == 0) return;
printString(argv);
return;
}
int printString(char* string) {
sprintf(string, "This is a test.\n");
}
如果按照C的语法规则,OK,没问题,但是,一旦把后缀改为cpp,立刻报三个错:“printString未定义”;
“cannot convert `char**' to `char*”;
”return-statement with no value“;
分别对应前面红色标注的部分。可见C++的语法规则更加严谨一些。
2.编译阶段,g++会调用gcc,对于c++代码,两者是等价的,但是因为gcc命令不能自动和C++程序使用的库联接,所以通常用g++来完成链接,为了统一起见,干脆编译/链接统统用g++了,这就给人一种错觉,好像cpp程序只能用g++似的。

误区二:gcc不会定义__cplusplus宏,而g++会

实际上,这个宏只是标志着编译器将会把代码按C还是C++语法来解释,如上所述,如果后缀为.c,并且采用gcc编译器,则该宏就是未定义的,否则,就是已定义。

误区三:编译只能用gcc,链接只能用g++
严格来说,这句话不算错误,但是它混淆了概念,应该这样说:编译可以用gcc/g++,而链接可以用g++或者gcc -lstdc++。因为gcc命令不能自动和C++程序使用的库联接,所以通常使用g++来完成联接。但在编译阶段,g++会自动调用gcc,二者等价。

误区四:extern "C"与gcc/g++有关系

实际上并无关系,无论是gcc还是g++,用extern "c"时,都是以C的命名方式来为symbol命名,否则,都以c++方式命名。试验如下:
me.h:
extern "C" void CppPrintf(void);

me.cpp:
#include
#include "me.h"
using namespace std;
void CppPrintf(void)
{
cout << "Hello\n";
}

test.cpp:
#include
#include
#include "me.h"
int main(void)
{
CppPrintf();
return 0;
}

1. 先给me.h加上extern "C",看用gcc和g++命名有什么不同

[root@root G++]# g++ -S me.cpp
[root@root G++]# less me.s
.globl _Z9CppPrintfv //注意此函数的命名
.type CppPrintf, @function
[root@root GCC]# gcc -S me.cpp
[root@root GCC]# less me.s
.globl _Z9CppPrintfv //注意此函数的命名
.type CppPrintf, @function
完全相同!

2. 去掉me.h中extern "C",看用gcc和g++命名有什么不同
[root@root GCC]# gcc -S me.cpp
[root@root GCC]# less me.s
.globl _Z9CppPrintfv //注意此函数的命名
.type _Z9CppPrintfv, @function
[root@root G++]# g++ -S me.cpp
[root@root G++]# less me.s
.globl _Z9CppPrintfv //注意此函数的命名
.type _Z9CppPrintfv, @function
完全相同!
【结论】完全相同,可见extern "C"与采用gcc/g++并无关系,以上的试验还间接的印证了前面的说法:在编译阶段,g++是调用gcc的。

‘贰’ C语言。GCC标准和C99标准有什么区别为什么语言还有标准之分是功能更新和升级么

GCC遵循标准C,但GCC扩展了一些功能,有些在标准C编译器不能通过,在GCC就能通过。举个简单例子:在标准C不支持变长数组,而GCC就可以支持,C89不支持任何位置定义变量,而GCC可以随处定义,即代码写到某处需要用一个变量即可就在那儿定义一个变量。

‘叁’ c语言和gcc有什么区别

g++和gcc都是计算机语言的编译器(在linux操作系统中运行)。前者用于编译c++语言,后者可编译c和c++语言。
编译器的作用就是把程序员根据某种计算机编程语言所写的代码翻译为机器指令让计算机执行。

‘肆’ C语言模拟命令行调用GCC编译器编译一个.c文件

包含<stdlib.h>头文件,调用的时候用
system("gcc
-o
yourfile
yourfile.c");
就可以了。
参考http://..com/link?url=BevN1jtqwLRE6WRKSJ3HpGp7_t4Z5J--5B4xvZObLoYws0JVfdkE35X_

‘伍’ 云课堂翁凯C语言教程所说的gcc是什么还有他后面说到的终端是指什么呢

gcc是GNU编译器套件,其初衷是为GNU操作系统专门编写的一款编译器。GNU系统是彻底的自由软件。
你可以在linux系统下使用它进行编译。
终端可以理解成windows的dos命令行窗口

‘陆’ 用gcc编译器C语言程序的技巧

方法/步骤
1、编写c代码,并输入以下代码,生成文件hello.c
[root@wahoo
test]#
vim
hello.c
#include
<stdio.h>
#define
DISPLAY
"hello
c!"
int
main(void)
{
printf("%s\n",
DISPLAY
);
return
0;
}
ZZ(说明:ZZ当前文件进行快速保存操作)
2、预编译(Preprocessing)
会对各种预处理指令(#include
#define
#ifdef
等#开始的代码行)进行处理,删除注释和多余的空白字符,生成一份新的代码
[root@wahoo
test]#gcc
-E
hello.c
-o
hello.i
E
参数
通知gcc对目标文件进行预编译,这里是对文件hello.c文件
o
参数
是对命令输出结果进行导入操作,这里是把
gcc
-E
hello.c
操作结果输出到文件hello.i(命名要自定义)中进行保存
这个命令执行完后我们目录下多了一个文件hello.i,你可以查阅一下文件的内容。
3、编译(Compilation)
对代码进行语法、语义分析和错误判断,生成汇编代码文件
[root@wahoo
test]#gcc
-S
hello.i
-o
hello.s
S
参数
通知gcc对目标文件进行编译,这里是对文件hello.i文件
通过这一步我们知道
C语言跟汇编的
关系,至于他们之前是如何进行转换的,大家可以进行更深入的学习与探讨。
此时目录下多了一个hello.s文件,内容如图
4、汇编(Assembly)
把汇编代码转换与计算机可认识的二进制文件,要知道计算机只认识0和1呢
[root@wahoo
test]#gcc
-c
hello.s
-o
hello.o
c
参数
通知gcc对目标文件执行指令转换操作
此步骤我们得到文件hello.o
大家也同样打开文件查看一下,这个文件里面几乎没几个字符大家能看懂,这就对了,但大家可以通过这种方法将其转化为我们可读的形式:
[root@wahoo
test]#readelf
-a
hello.o
5、链接(Linking/Build)
通俗的讲就是把多个*.o文件合并成一个可执行文件,二进制指令文件
[root@wahoo
test]#gcc
hello.o
-o
hello
这里我们就得到了一个可以直接在系统下执行的文件
hello
我们也可以对这个文件进行readelf操作,也可以进行二进制指令转汇编的操作
[root@wahoo
test]#objmp
-d
hello
6、程序运行
[root@wahoo
test]#./hello
hello
c!
7、总结:gcc
编译c程序的主要过程包括
预编译->编译->汇编->连接
四个过程,每个过程都分别进行不同的处理,了解了这其中的一些原理,对c编程的理解大有益处

‘柒’ C语言 gcc错误

gcc编译的时候,如果设置了-c, 说明只编译不链接。
这时如果指定-o target的话,那么就只能编译一个文件。
比如
gcc -c a.c -o a.o
而如果指定编译多个文件就只能
gcc -c a.c b.c c.c
这时会自动生成a.o b.o c.o
但是如果-c 多个源文件,然后-o就会出现你说的这个错误。比如
gcc -c a.c b.c c.c -o a.o
gcc没法在不做连接的情况下,把三个c文件编译成一个.o文件。

所以,改一下你的编译参数,去掉-c 或者去掉-o

‘捌’ gcc如何编译运行c语言程序

  1. 用vim编辑器写完代码,给该文本命名为名称.c,名称任意取,比如hello,c保存。

  2. 终端打开,切换当前路径,PS:一般情况下就是在当前路径。

  3. 输入:gcc hello.c -o a.out

  4. 执行代码:./a.out

热点内容
微软不给源码 发布:2025-02-11 16:13:37 浏览:38
php的get方法 发布:2025-02-11 16:12:30 浏览:967
源码网嘉 发布:2025-02-11 16:07:06 浏览:192
免费ftp服务软件 发布:2025-02-11 15:58:06 浏览:866
大樱桃建园为什么要配置授粉树 发布:2025-02-11 15:58:00 浏览:629
五菱宏光s顶配有哪些配置 发布:2025-02-11 15:50:57 浏览:287
华为8加128配置有哪些 发布:2025-02-11 15:48:20 浏览:580
压缩机三转子 发布:2025-02-11 15:45:54 浏览:828
linux操作系统shell 发布:2025-02-11 15:45:53 浏览:339
安卓模拟器如何选择安装 发布:2025-02-11 15:34:26 浏览:177