- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
gcc和g编译器
gcc和g++都是GNU(组织)的一个编译器。
我们在编译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 stdio.hint main(int argc, char* argv[]) {???if(argv == 0) return;??? printString(argv);//在使用该函数前应该先声明或定义???return;//这里不符合C++标准, 应该返回一个值}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 iostream#include me.husing namespace std;void CppPrintf(void){?????cout Hello\n;}test.cpp:#include stdlib.h#include stdio.h#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
文档评论(0)