<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://jackxiang.com/post//</link>
<title><![CDATA[gcc和g++的区别]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Wed, 10 Sep 2008 04:06:09 +0000</pubDate> 
<guid>http://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	gcc和g++都是GNU(组织)的一个编译器。<br/><br/>误区一:gcc只能编译c代码,g++只能编译c++代码<br/>两者都可以，但是请注意：<br/>1.后缀为.c的，gcc把它当作是C程序，而g++当作是c++程序；后缀为.cpp的，两者都会认为是c++程序，注意，虽然c++是c的超集，但是两者对语法的要求是有区别的。C++的语法规则更加严谨一些。<br/>2.编译阶段，g++会调用gcc，对于c++代码，两者是等价的，但是因为gcc命令不能自动和C＋＋程序使用的库联接，所以通常用g++来完成链接，为了统一起见，干脆编译/链接统统用g++了，这就给人一种错觉，好像cpp程序只能用g++似的。<br/><br/>误区二:gcc不会定义__cplusplus宏，而g++会<br/>实际上，这个宏只是标志着编译器将会把代码按C还是C++语法来解释，如上所述，如果后缀为.c，并且采用gcc编译器，则该宏就是未定义的，否则，就是已定义。<br/><br/>误区三:编译只能用gcc，链接只能用g++<br/>严格来说，这句话不算错误，但是它混淆了概念，应该这样说：编译可以用gcc/g++，而链接可以用g++或者gcc -lstdc++。因为gcc命令不能自动和C＋＋程序使用的库联接，所以通常使用g++来完成联接。但在编译阶段，g++会自动调用gcc，二者等价。<br/>gcc和g++的区别<br/>我们在编译c/c++代码的时候，有人用gcc，有人用g++，于是各种说法都来了，譬如c代码用gcc，而c++代码用g++，或者说编译用 gcc，链接用g++，一时也不知哪个说法正确，如果再遇上个extern &quot;C&quot;，分歧就更多了，这里我想作个了结，毕竟知识的目的是令人更清醒，而不是更糊涂。<br/><br/>误区一:gcc只能编译c代码,g++只能编译c++代码<br/><br/>两者都可以，但是请注意：<br/>1.后缀为.c的，gcc把它当作是C程序，而g++当作是c++程序；后缀为.cpp的，两者都会认为是c++程序，注意，虽然c++是c的超集，但是两者对语法的要求是有区别的，例如：<br/>#include &lt;stdio.h&gt;<br/>int main(int argc, char* argv[]) {<br/>&nbsp;&nbsp; if(argv == 0) return;<br/>&nbsp;&nbsp; printString(argv);<br/>&nbsp;&nbsp; return;<br/>}<br/>int printString(char* string) {<br/>&nbsp;&nbsp;sprintf(string, &quot;This is a test.&#92;n&quot;);<br/>}<br/>如果按照C的语法规则，OK，没问题，但是，一旦把后缀改为cpp，立刻报三个错：“printString未定义”；<br/>“cannot convert `char**&#039; to `char*”；<br/>”return-statement with no value“；<br/>分别对应前面红色标注的部分。可见C++的语法规则更加严谨一些。<br/>2.编译阶段，g++会调用gcc，对于c++代码，两者是等价的，但是因为gcc命令不能自动和C＋＋程序使用的库联接，所以通常用g++来完成链接，为了统一起见，干脆编译/链接统统用g++了，这就给人一种错觉，好像cpp程序只能用g++似的。<br/><br/>误区二:gcc不会定义__cplusplus宏，而g++会<br/><br/>实际上，这个宏只是标志着编译器将会把代码按C还是C++语法来解释，如上所述，如果后缀为.c，并且采用gcc编译器，则该宏就是未定义的，否则，就是已定义。<br/><br/>误区三:编译只能用gcc，链接只能用g++<br/><br/>严格来说，这句话不算错误，但是它混淆了概念，应该这样说：编译可以用gcc/g++，而链接可以用g++或者gcc -lstdc++。因为gcc命令不能自动和C＋＋程序使用的库联接，所以通常使用g++来完成联接。但在编译阶段，g++会自动调用gcc，二者等价。<br/><br/>误区四:extern &quot;C&quot;与gcc/g++有关系<br/><br/>实际上并无关系，无论是gcc还是g++，用extern &quot;c&quot;时，都是以C的命名方式来为symbol命名，否则，都以c++方式命名。试验如下：<br/>me.h：<br/>extern &quot;C&quot; void CppPrintf(void);<br/><br/>me.cpp:<br/>#include &lt;iostream&gt;<br/>#include &quot;me.h&quot;<br/>using namespace std;<br/>void CppPrintf(void)<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; &quot;Hello&#92;n&quot;;<br/>}<br/><br/>test.cpp:<br/>#include &lt;stdlib.h&gt;<br/>#include &lt;stdio.h&gt;<br/>#include &quot;me.h&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>int main(void)<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;CppPrintf();<br/>&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br/>}<br/><br/>1. 先给me.h加上extern &quot;C&quot;，看用gcc和g++命名有什么不同<br/><br/>[root@root G++]# g++ -S me.cpp<br/>[root@root G++]# less me.s<br/>.globl _Z9CppPrintfv&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//注意此函数的命名<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.type&nbsp;&nbsp; CppPrintf, @function<br/>[root@root GCC]# gcc -S me.cpp<br/>[root@root GCC]# less me.s<br/>.globl _Z9CppPrintfv&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//注意此函数的命名<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.type&nbsp;&nbsp; CppPrintf, @function<br/>完全相同！<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>2. 去掉me.h中extern &quot;C&quot;，看用gcc和g++命名有什么不同<br/><br/>[root@root GCC]# gcc -S me.cpp<br/>[root@root GCC]# less me.s<br/>.globl _Z9CppPrintfv&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//注意此函数的命名<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.type&nbsp;&nbsp; _Z9CppPrintfv, @function<br/>[root@root G++]# g++ -S me.cpp<br/>[root@root G++]# less me.s<br/>.globl _Z9CppPrintfv&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//注意此函数的命名<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.type&nbsp;&nbsp; _Z9CppPrintfv, @function<br/>完全相同！
]]>
</description>
</item><item>
<link>http://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] gcc和g++的区别]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>