Part I 如何上路
1. vi, vim是编译器么?
vi means visual editor,是软件世界第一个全屏幕编辑器,最初的作者是现在Sun microsystem的Bill Joy。
vim means Vi IMproved,可以看作是增强的vi。
很不幸,他们都不是编译器,如果你已经写好了first.c,那么不能指望vi们将你的源代码变成执行程序。
2. gcc, g++这些都是干什么用的
gcc means GNU C Collector,是GNU的旗舰软件,自由软件,C语言编译器。
g++ 是GNU的C++编译器。
3. 那么cc, CC, ld, make这些程序又是干什么的呢?
cc是unix world中对c编译器的叫法,就是c compiler。
CC是对c++编译器的叫法,这两个名称都不特指某一厂家的产品。例如HP提供的HP-UX上c编译器叫cc,Solaris上
的c编译器也叫cc
ld means link editor,是连接器的通称,并不特指某一个具体的产品。但是他们都是用来连接目标文件的。
make means ???,make程序根据Makefile/makefile中指定的规则,以及一些默认的规则,完成从源代码到最终
代码的处理过程。不光可以用来编译连接程序,也可以做其它的一些有依赖,分阶段的事情。
4. 我已经安装了linux,如何开始我的C/C++之旅呢?
step 1: typein a helloworld program(1) in your favorate editor, I think it must be a vim
step 2: save your program to hello.c and then quit from the editor
step 3: typein 'gcc hello.c'
step 4: typein 'a.out'
7. printf的头文件在哪里?
你在星巴克里跟女朋友聊天并同时向邻座的单身女孩抛媚眼的时候,脑子里还在想一个想了很长时间但是一直没有答案的
问题,到底如何向屏幕输出一行文字呢?这时候,两个笨蛋从你旁边经过,他们正在讨论printf,你听到后,觉得:哦
这才是我想要的,对printf,没错。但是你那如编译器一般的大脑马上提醒你,找不到函数原型,应该包含什么头文件呢
于是你停止聊天和抛接媚眼,打开手提电脑,通过某种无线装置接入到internet,在bbs上发了一个帖子:
where the printf() is defined?
但是出乎你的意料,尽管这是一个刚果人都经常光顾的bbs,但是居然过去了5分钟之后,仍然没有人回答你。看来这个问
题偏难,你微笑着对你的女朋友说。
事实上,你不应该问这样的问题。你应该学会自己解决这样的问题,我提供给你几个途径:
man printf(如果该关键字有多个entry,则应该用man -a或者man -k,或者直接指定section)
find /usr/include -name "*.h" -print | xargs grep printf
search on Google
8. 我已经有多个.c 文件了,应该如何编译呢?
经过一段时间的开发,你的程序目前已经从一个简单的foo.c变成了两个文件,foo.c和bar.c,我们假定foo.c中定义了
main函数。那么:
gcc -g bar.c
将报告你没有main函数。这让你很恼火,是否应该合并两个文件呢?还是。。。?
11. 我有了10个.c文件,还是一个一个编译么?有没有工程的概念(就象vc的dsp)?
确实一个一个编译很土。我们有更好的办法,就是make。make程序是一个类似脚本执行程序一样的东西。它根据你提供的
Makefile(或者小写的makefile)来工作,它可以处理复杂的依赖关系,就象你希望的那样,如果修改了一个头文件,那
么包含它的所有.c程序都应该被重新编译。但是很不幸,这种依赖关系需要你自己指定。你首先要了解makefile的语法,
然后根据语法来写makefile。当程序很多得时候,makefile也变得复杂。如果你希望得到makefile得更详细信息,可以
man make
或者在linux里面:
info make
但是没有更简单的办法么?好在世界上除了你我之外还有很多人注意到了这个问题。目前有两个简单的办法:
Part II 语言
1. Windows vs Linux?
这里扯出这个问题好象有些奇怪。这个文档主要是以linux为背景讲的,因此很少涉及到Windows平台下面的东西。但是这不等于说Windows不好,只是顾及了我自己的一些偏好。开始学习的初期,这些因素的影响不大,不用加入到孰优孰劣的无聊争论中。
2. 我要学习C++,需要C语言的知识么?
C++和C这两种语言的关系在The C++ Programming Language这本书的1.6节讲的已经很清楚了,如果你有什么疑问,可以仔细读一读。应该可以不需要C语言的知识就可以开始学习C++,但是有些C的基本常识,再学习C++,肯定是有帮助的。
struct S
{
int a;
int b;
int c;
};
int main()
{
struct S s;
s.a = 10; s.b=5; s.c=1;;
return 0;
}
首先要解释一下,gcc -E的含义,-E这个参数表示要求gcc在进行预处理之后就停止,不要继续工作下去了,先休息休息。
类似char * s = "this is a string";这样的语句,s这个指针指向的内存是否需要释放呢?答案还是不需要。"this
is a
string"所需要的内存在程序被编译的时候就已经确定下来了,在栈上分配。我们怎么判断这一点呢?好在linux给我们提供了足够的工具,我们可以用
size这个程序来观察程序的代码(text)段。通过将这个字符串变长或者变短,我们会发现text段的长度也随之变化。而动态分配的内存大小对代码段
的大小是没有影响的。这个内存块不是你分配的,所以你不要释放。