中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > C/C++
趁五一整理了一份FAQ,新手看一下
作者:未知 时间:2005-09-13 19:32 出处:ChinaUnix.net 责编:chinaitpower
              摘要:趁五一整理了一份FAQ,新手看一下

说明:本版精华区已经有odin_free老大的好几份FAQ了,不过我觉得近来问问题的人可能想要更直接的回答,哪怕浅薄些。本FAQ就是这样的一份。欢迎大家指正错误,也欢迎补充不足 :D  :D 
[size=18:8c4d9475a8][color=red:8c4d9475a8]
一。UNIX/Linux环境篇[/color:8c4d9475a8][/size:8c4d9475a8]

Q:我想学Unix/Linux下的程序设计,该用什么语言?该看什么书?
A:应该首选C。无论是Unix自身,还是其上运行的软件,绝大部分都是用C写的。Unix操作系统的API(系统调用)接口也是以C函数的形式给出的。有两本书是必读的:《C程序设计语言》第二版,和《Unix环境高级编程》,这两本书含金量太高,推荐你买印刷版。


Q:“段错误”是什么原因?
A:程序运行中出现段错误(segmentation fault),是由于出现了内存违例访问,比方说,读或写一块没分配给你的内存,写具有只读属性的内存,等等。初学者容易犯这样的错误:

1 struct student {
2 int age;
3 char name[128];
4 int score;
5 };
6
7 struct student *p;
8 p->age = 21;/*错误!student结构还没实例化、没分配空间呢*/

第7行应改为:
struct student a;
struct student *p = &


Q:我写了个Unix的小程序,可是编译报错,说函数未声明?
A:你应该 “man 函数名”,把手册中给出的头文件在程序中#include进去。


Q:我在Solaries/Aix/HP-UX/Irix/Tru64……上编写程序,为什么编译报错,说找不到函数定义?
A:你应该在编译时指定需要连接的库。例如,若程序中使用了标准C的数学库,则加上-lm;若使用了posix线程库,则加上-lpthread;若使用了socket函数,则加上-lsocket;若使用了posix实时扩展库,则加上-lrt;等等。
另外,Linux上的gcc编译时会自动寻找需要某些系统库,象在Linux上用gcc编译socket程序不用指定-lsocket也可以,但是遗憾的是:1)并非对所有的库都有效,如数学库就不会自动加上;2)并非所有Unix上的CC都提供这个特性。


Q:我编译程序,指定了连接某个库,可是不对啊?
A:如果你的头文件和库文件不在标准搜索路径中,要在编译时指定它们。

举例来说,我的mysql安装在/usr/local/mysql/下,头文件在/usr/local/mysql/include/mysql/下,库文件在/usr/local/mysql/lib/mysql/下,我要连接mysqlclient这个库,则编译选项是这样的:
CFLAGS = -Wall -g -I/usr/local/mysql/include/mysql -L/usr/local/mysql/lib/mysql -lmysqlclient

Q:我按照上面的格式编译程序,通过了,可运行时找不到共享库了?
A:上面这个例子,在生成的可执行文件中加入了库路径的信息,因此,如果你的库文件不在标准路径下,可以:1)把它复制到/usr/lib/下,如果该库非常常用;2)修改/etc/ld.so.conf文件,把库的全路径添加进去,运行ldconfig;3)export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:your-path,如果该库不太常用的话。

Q:我想学习Makefile的写法,怎么办?
A:本版精华区有《跟我一起写Makefile》,请参考。

Q:我想学习GDB,怎么办?
A:本版精华区有《使用GDB调试程序》,请参考。


[size=18:8c4d9475a8][color=red:8c4d9475a8]二。Vi/Vim篇[/color:8c4d9475a8][/size:8c4d9475a8]
(如无特别说明,称为Vim。另,只说明vimtutor中没讲到、但又比较实用的,细节请参考flw版主的置顶贴,和下面给出的中文手册)

Q:vi和vim有什么区别?
A:vi是VIsual的意思,是伴随着几乎是最初的Unix发行版的编辑器;vim是VI Improved的意思,即Vi的增强版。推荐用Vim。

Q:哪里能找到Vim的中文手册?
A:Vim用户手册:
http://vcd.gro.clinux.org/
Vim帮助手册:
http://vimcdoc.sf.net。

Q:vim中怎样上下左右移动光标?
A:请运行vimtutor,它会手把手教你如何使用vim的最基本功能。

Q:vim中如何进入man手册?
A:光标移动到函数名上,按大写的K,就会进入手册页。

Q:但是我把光标停留在printf上,按K,进入了bash的printf手册啊?
A:printf是C库函数,在手册页中属于第三部分。请先输入3,再按K。如果是系统调用(例如kill函数),先输入2再按K。

Q:我想知道某个系统定义的类型,比方说stat的真实定义,怎么做?
A:在vim中运行:ps stat,它会自动为你搜索该类型的真实定义。

Q:我想学习Vim的很多强大功能,怎么办?
A:参考flw版主的置顶贴,
http://bbs.chinaunix.net/forum/viewtopic.php?t=472608

[size=18:8c4d9475a8][color=red:8c4d9475a8]三。好书推荐篇[/color:8c4d9475a8][/size:8c4d9475a8](若无特别说明,则是机械工业出版的)

[color=blue:8c4d9475a8]4.1。C语言篇[/color:8c4d9475a8]

Q:我是C语言的初学者,该看什么书?
A:推荐看谭浩强老师的《C程序设计教程》第二版。(清华大学出版社)

Q:我想进一步学习C语言,该看什么书?
A:K&R的《C程序设计语言》第二版是必读书。此外,推荐《程序设计实践》(机械工业有影印版)、《C语言接口与实现》、《C专家编程》(人民邮电)、《C:陷阱与缺陷》(人民邮电),以及从Stevens的著作中学习程序设计。

Q:我想成为C语言高手,该看什么书?
A:不好意思,我没资格回答这个问题。

[color=blue:8c4d9475a8]4.2。数据结构与算法篇[/color:8c4d9475a8]
Q:我数据结构与算法很菜,该看什么书?

A:推荐严蔚敏老师《数据结构与算法──C语言描述》第二版。(清华大学出版社)

Q:我想进一步学习数据结构与算法,该看什么书?
A:推荐Mark Allen Weiss的《数据结构与算法分析──C语言描述》第二版。

Q:我想掌握优秀程序员该掌握的所有数据结构与算法知识,该看什么书?
A:推荐Robert Sedgewick的《算法》第三版上下册,人民邮电出版。影印版《Algorithms in C》第三版上下册,中国电力出版。(说明:很惭愧,此书是根据牛人的推荐而来的,我还没看过几页)

[color=blue:8c4d9475a8]4.3。Unix/Linux程序设计篇[/color:8c4d9475a8]

Q:我想学习Unix/Linux下的程序设计,有专门讲这个的书吗?
A:Stevens的《Unix环境高级编程》是本领域无可替代的名著,请仔细阅读。(有影印版,也是机械工业出版)

Q:我想学习Unix/Linux的socket编程,看什么书?
A:Stevens的两卷《Unix网络编程》(第二版)是本领域无可替代的名著,请仔细阅读。都是清华大学出版社出版(都有影印版,卷二也是清华出版;其中卷一是第三版,机械工业出版,更详尽)

[color=blue:8c4d9475a8]4.4。C++篇[/color:8c4d9475a8]

Q:C++有哪些经典好书?
A:这个问题太大了,请参考whyglinux大侠的精华帖子:
http://bbs.chinaunix.net/forum/viewtopic.php?t=321401
[size=18:8c4d9475a8]
[color=red:8c4d9475a8]四。C++篇[/color:8c4d9475a8]
[/size:8c4d9475a8]
Q:为什么我的Hello World程序都报错?
A:请用g++命令编译C++程序,用gcc命令编译C程序──它们在最后确定需要连接的库时有所不同。

Q:我写了小程序,为什么报错说“cout未定义”?
A:请在程序中所有的include之后,加上using namespace std;另外,建议看一些“标准C++”的资料。

Q:我在VC下的程序编译报错,怎么回事?
A:不知道怎么回事。VC高版本不知道,VC6的作为开发框架的MFC和ATL不知道,但我知道VC6的编译器很垃圾。如果你一定要在Windows下学习C++,推荐用Dev-C++。

Q:我用Dev-C++编译程序,可是运行时一闪就过去了,怎样让屏幕停住?
A:在主函数返回前加上一句system(“pause”);或者cin.get();。
[color=red:8c4d9475a8][size=18:8c4d9475a8]
五。杂项篇
[/size:8c4d9475a8][/color:8c4d9475a8]
Q:我该学习Java还是C++?
A:不知道。

Q:vim和emacs哪个更强大?
A:不知道。

Q:哪里能下载到Unix/Linux和C/C++的电子书?
A:参考本版lenovo版主的置顶贴。

Q:我是否需要精通英文?
A:英语是程序员的母语。个人认为,至少应该到这样的水平:读Stevens博士的原著时畅通无阻。

Q:哪里有讲解各种知识的资料?
A:GOOGLE有。如果你想找某个软件,输入名称,点击“手气不错”,就会直接转到主站点。如果你想找某个具体领域的资料,输入名称,加上一句“filetype:pdf”,可以找到很多PDF文档。

Q:我该用进程还是线程?
A:具体问题具体分析,本版精华区有关于线程/进程性能的讨论。

Q:哪里有Unix/Linux的函数说明?
A:man手册是你最好的良师益友。

Q:我想学习Linux的界面编程,学哪个好?
A:ncurse,Gtk+/Gtkmm/Glade,Qt,Motif……都可以,建议去http://www.linuxforum.net的快速开发版下载资料、学习。

Q:APUE好难啊,看不懂怎么办?
A:老实说,我没资格回答这个问题,因为有很多地方我也看不懂。但大体从第一章到第十四章(第十一章或许可以除外?)总该认认真真的读上一遍,写程序试验,中文版看不懂的地方参照英文版理解。APUE写的很深入,而且有些内容确实过时了(毕竟是1992年的书,美国已经出第二版了),与现有OS是矛盾的,但仍然是UNIX程序设计的权威书籍。

Q:这里的人总说APUE,UNP,K&R,TCPL,TCPvX,……,都是什么啊?
A:APUE,Advanced Programming in the Unix Environment,UNIX环境高级编程;
UNP,Unix Network Programming,Unix网络编程;
K&R,Brian Kernighan和Dennis Ritchie的著作,The C Programming Language,C程序设计语言;
TCPL,The C++ Programming Language,C++程序设计语言;
D&E,The Design and Evolution of C++,C++语言的设计与演化;
TCPv1,TCP/IP Illustrated Volume I,TCP/IP详解卷1;
……

Q:为什么编译器说找不到itoa这个函数?
A:因为它不是标准函数,引入此函数根本是多此一举。请用sprintf。

Q:Unix/Linux下有什么好的内存泄漏检测工具?
A:没用过,据说dmalloc不错。

Q:进程退出时会释放空间吗?
A:一定会。如果某块内存只有一个进程在用,则该进程结束时──无论是调用exit或从main返回而正常退出,还是被信号杀死──那块内存都无条件释放。

Q:哪里能找到线程池的代码?
A:UNPv1-2nd第27章就有两个线程池实例(3rd在第30章)。这种等待异步事件(如accept函数的返回)是线程池的主要用场,此外,还有一种是信号驱动的,例如基于定时器的线程池。后一种请参考Me的demo程序(王婆卖瓜一下哈):
http://bbs.chinaunix.net/forum/viewtopic.php?t=536596

 flw 回复于:2005-05-08 16:43:24
很好。不错。

 albcamus 回复于:2005-05-08 16:48:49
多谢老大夸奖。这个主要是C++的太少了,(我那点C++水平说出来不够丢人的),要是大家能继续补充,集锦在一起就好了。

 mq110 回复于:2005-05-08 17:36:29
albcamus
 哥 五一辛苦了

 jin.liu 回复于:2005-05-08 17:43:27
谢谢阿。
[quote:617b16c5d5]第7行应改为: 
 struct student a; 
 struct student *p = & 
[/quote:617b16c5d5]
上面是不是错了阿??是否应该:
 struct student *p = &a;

 albcamus 回复于:2005-05-08 18:00:43
是啊,是论坛把后面的符号吃掉了。

 bleem1998 回复于:2005-05-08 19:10:23
albcamus你真的是过了一个51“劳动”节阿
呵呵
支持!

 aero 回复于:2005-05-09 09:06:01
^_^,真辛苦。成C/C++劳模了。鼓励,鼓励。

 guzhou 回复于:2005-05-09 19:24:12
不错。
建议把下面:
[quote:531c7dd528]Q:我该学习Java还是C++? 
A:不知道。 

Q:vim和emacs哪个更强大? 
A:不知道。
[/quote:531c7dd528]
改成:
Q:我该学习Java还是C++?
A:我刚吃过饭。

Q:vim和emacs哪个更强大?
A:我刷过牙了。

呵呵,搞笑。不过确实觉得这样的提问有些无聊。

 laolou_1983 回复于:2005-05-10 14:14:12
多谢大哥提携!!

 sfi 回复于:2005-05-10 15:27:37
不错不错。辛苦辛苦。

多出一些合集还是不错的,也是很有必要的。

 xjxyly_chinaunix_net 回复于:2005-05-11 09:26:58
真的不错,菜鸟都该多看看.

 eagerly1 回复于:2005-05-14 16:48:46
楼主辛苦了

 老蒋 回复于:2005-05-14 23:23:01
《C程序设计语言》第二版现只能买到中译本,是徐宝文翻译的,翻译质量不是很好。我很想买影印版的,可惜影印版的已经绝版了。

哎!

 gvim 回复于:2005-05-15 19:27:22
再补充 albcamus 一本书:
Computer Systems: A Programmer's Prespective
:)

 zzz968 回复于:2005-05-16 17:08:43
楼上的大哥大姐都很熟吗?俺是新手请多多指教~~~~

 carol1980 回复于:2005-05-17 09:56:58
入门linux编程我还是推荐 Linux程序设计 作为第一本书。

 xyco 回复于:2005-05-17 14:33:45
我想学,不过路很长,真的提不起劲

 benlan 回复于:2005-05-20 17:42:26
Q:c能调用c++封装的动态库吗?
A:可以,使用dlopen , dlsym 和 extern "C"
下面是个简单的例程:

[quote:4938b16995][root@localhost dlopen]# ls
chello.cpp  hello.cpp  include  main.c
[root@localhost dlopen]# cat include/hello.h
#ifndef _HELLO_H_
#define _HELLO_H_
 
class CHello
{
public:
        CHello();
        ~CHello();
        int Print();
};
 
#endif
[root@localhost dlopen]# cat hello.cpp
#include "hello.h"
#include <iostream>
 
CHello::CHello()
{
 
}
 
CHello::~CHello()
{
 
}
 
int CHello::Print()
{
        std::cerr << "hello world !" << std::endl;
}
[root@localhost dlopen]# cat chello.cpp
extern "C"
{
        #include "hello.h"
 
        int cprint()
        {
                CHello * phello;
                (void *)phello =  (void *)new CHello ;
 
                (void *)phello-> Print();
 
                return 0;
        }
}
[root@localhost dlopen]# cat main.c
//#include "chello.h"
#include <dlfcn.h>
#include <stdio.h>
#include <stdlib.h>
int cprint();
 
int
main ()
{
  char *error;
  void *handle = dlopen ("libhello.so", RTLD_NOW);
  if (!handle)
    {
      fprintf (stderr, "%s\n", dlerror ());
      exit (1);
    }
 
  int (*dlprint)() ;
  (void *)dlprint = dlsym (handle, "cprint");
  if ((error = dlerror ()) != NULL)
    {
      fprintf (stderr, "%s\n", error);
      exit (1);
    }
 
  (*dlprint)();
 
  dlclose (handle);
 
 
  return 0;
}
[root@localhost dlopen]# g++ -I./include -c hello.cpp
[root@localhost dlopen]# g++ -I./include -c chello.cpp
[root@localhost dlopen]# g++ -fPIC -shared -o libhello.so  hello.o chello.o
[root@localhost dlopen]# gcc  -I./include -o main main.c  -lhello -ldl
[root@localhost dlopen]# ls
chello.cpp  chello.o  hello.cpp  hello.o  include  libhello.so  main  main.c
[root@localhost dlopen]# ./main
hello world !
[root@localhost dlopen]#

[/quote:4938b16995]

 longbegue 回复于:2005-05-22 11:07:31
dalong向albcamus 致敬,人民感谢你!

 ymmij 回复于:2005-05-22 18:01:34
谢谢大哥的指导

 luguang7012 回复于:2005-05-24 15:41:19
不错

 yongjunxiao 回复于:2005-05-26 15:48:58
感谢!

 icedragon 回复于:2005-06-04 21:59:39
感谢楼主的辛勤劳动

 caicheng 回复于:2005-06-04 23:27:28
楼主真是辛苦了!
楼主的BLOG里的文章真让人惊叹!
文理双全!高人!

 yuxh 回复于:2005-06-05 14:37:59
那家伙是当个学问在研究的,呵呵~~~
感觉其实文理很难兼容,思维方式不一样。文的东西搞多了,就懒得看程序;程序看多了,文方面的东西就提不想劲来了。我现在就是第二种状态。。。

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有