一。GNU


GNU是“GNU 's Not Unix”的递归缩写, Stallman宣布GNU应当发音为Guh-NOO(革奴)以避免与new这个单词混淆(注:Gnu在英文中原意为非洲牛羚,发音与new同样)


为保证GNU软件能够自由地“使用、复制、改动和公布”,全部GNU软件都在一份在禁止其它人加入不论什么限制的情况下授权全部权利给不论什么人的协议条款,GNU通用公共许可证(GNU General Public License。GPL)。这个就是被称为“反版权”(或称Copyleft)的概念。


GUN能够理解为一种linux规范。


二。gcc与g++的差别


gcc和g++都是GNU(组织)的一个编译器。对它们的认识有非常多误区:



【误区一】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

#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的。