手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>网站运营>建站经验>列表

Unix(Linux) C编程问题精粹

来源:互联网 作者:west263.com 时间:2008-04-16
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

[]lint有哪些特色?
在编译之前使用lint的重要原因是LINT不但能发现ANSI C中的语法错误,而且也能指出潜在的问题或是难于移植于另一机器的代码问题.除了能指出简单语法错误之外,LINUT还能基于以下原因指出另外的错误:
A.无法达到的语句.
B.没有进入循环.
C.没有被使用的变量.
D.函数参数从未使用.
E.没有赋值之前自动使用参数.
F.函数在有些地方有返回值,但在其他地方不返回.
G.函数调用在不同地方使得参数个数不同.
H.错误使用结构指针.
I.模糊使用操作符优先级.
呵呵呵,挺有用的吧!

[]如何控制LINT的输出?
有时LINT会有一大屏一大屏的警告信息.但似乎并未指出错误.为了找出潜在的错误则需费心费力地浏览这些大量的警告信息.
但假如您的程式会分出几个单独的模块,在初级启动LINT时不要用可选项.当对这些模块进行更改或扩充时,能够忽略和代码无关的某些警告.为此可用以下选择项:
-h 对判别是否有错,类型是否正确不给出启发式测试.
-v 不管函数中没有定义的参数
-u 不管被使用的变量和函数没有定义或定义了但没有使用.

[]干脆,在程式中插入指令来影响LINT运行.他看样子有些像注释.
/*NOTREACHED*/ 不可达到的代码不给信息说明.
/*VARARGSn*/ 函数的变量个数不作通常的检查,只检查开始n个参数的数据类型.
/*NOSTRUCT*/ 对下一个表达式不作严格类型检查.
/*ARGUSED*/ 下一函数中,不给出没被使用参数的警告信息.
/*LINTLIBRARY*/ 置于文档的开头,他将不给出没被使用函数的警告信息.

关于LINT的更多用法,请用man lint来获知.


第五章:使用make

[]什么是make?

Unix(Linux)是个天生的研发平台,我为此感到高兴.make是个强力的工具.他能自动跟踪相互依赖的源代码块并组成一程式,使得很容易建立一可执行程式.Make就是这种有依赖关系的部分和代码之间所作的规格说明.


[] 任何的程式都要使用make?
是的.尽管您只有几个简单的模块,但您需要有一种结构来支持他从简单走向复杂.除非您的程式已盖棺定论.

[]Makefile由哪些组成?
Makefile由以下几个部分组成:

注释.
^^^^
使用#符号插入.make将忽略#之后的任何内容连同其后的RETURN键.

变量.
^^^^
make允许定义和SHELL变量类似的有名变量.比如,您定义了SOURCES=prog.c,那么该变量的值$(SCOURES)就包含了源文档名.

依赖关系.
^^^^^^^^
左边是目标模块,后接一冒号.再接和该模块有依赖关系的模块.

命令.
^^^^
以TAB键开始(即使用相同数量的空格也不能代替他).


[]Makefile示例
下面介绍一个简单的示例来说明make的用法.假设您的程式有两个源文档main.c和myc.c,一个位於子目录include下的头文档myhead.h,一个库由三个源文档myrout1.c,myrout2.c,myrout3.c产生.
其makefile文档为:
#一个基本的MAKEFILE文档.
#其中包括个人的头文档和个人库.
HEADERS=include/myhead.h
SOURCES=main.c myc.c
PRODUCT=$(HOME)/bin/tool
LIB=myrout.a
LIBSOURES=myrout1.c myrout2.c myrout3.c
CC=cc
CFLAGS=-g
all:$(PRODUCT)
$(PRODUCT):$(SOURCES)
$(CC)$(CFLAGS) -o $(PRODUCT)$(SOURCES)
lint:$(PRODUCT)
lint $(SOURCES)$(LIBSOURCES)
哈哈,挺象SHELL编程的.假如您和我相同使用LINUX下的gcc,那么只要把上面的CC=cc改为CC=gcc即可.怎么样,想来一个更复杂点的吗?

[]一个更为复杂的Makefile
您是否注意到,在上例中,只要启动make,就会重新编译任何源代码.
假如您能看懂以下的makefile,恭喜恭喜,您通关了.
#一个更为复杂的makefile
HEADERS=include/myhead.h
SOURES=main.c myc.c
OBJECTS=main.c myc.c
PRODUCT=$(HOME)/bin/tool
LIB=myrout.a
LIBSOURCES=myrout1.c myrout2.c myrout3.c
LIBOBJECTS=$(LIB)(myrout1.o)$(LIB)(myrout2.o)$(LIB)(myrout3.o)
INCLUDE=include
CC=cc
CFLAGS=-g -Xc
LINT=lint
LINTFLAGS=-Xc
all:$(PRODUCT)
$(PRODUCT):$(OBJECTS)$(LIB)
$(CC)(CFLAGS)-o$(PRODUCT)$(OBJECTS)$(LIB)
.c.o: $(HEADERS)
$(CC)$(CFLAGS) -c I$(INCLUDE)$<
$(LIB):$(HEADERS)$(LIBSOURCES)
$(CC) $(CFLAGS) -c $(?:.o=.c)
ar rv $(LIB) $?
rm $?
.c.c:;
lint: $(PRODUCT)
$(LINT)$(LINIFLAGS)$(SOURCES)$LIBSOURCES)


第六章:优质无错编程


亲爱的,检查一下,您是否注意到了以下的细节?也就是说,您是否是个合格的,能编写优质无错代码的程式员?要永远记住,编写无错代码是程式员的责任,而不是测试员.(摘录于本人的"细节页",因此本节将永远不会保持完整,欢迎您来充实她)

[]任何程式员至少出现过的一个错误:
if(a=3)假如a等于3,那么......
您至少要养成这样的习惯:当判断一个变量和一个常量是否相等时,将常量写在前面.这样即使您一不小心写成这样:if(3=a)在cc 之前就能够很容易发现他.


[]老调重弹:逻辑操作符的优先权.
我不愿多嘴.总之,假如您一定要编写如下代码时:
if(a&0x1&&b&0x2)
您的手头最好有一本详尽的指南.或您是这方面的专家.

[]尽量不使用int数据类型.
这仅是个忠告.您大可使用char,short,long数据类型.若干年以后,当您成长为高手之时,您会发现此时我的良苦用心.

[]对于非整型函数一定要完整定义.
如 long float jisuan(char chArr[],int chNum)
{ long float lMydata;
...
...
return(lMydata); }

[]对于非整型函数的输入要当心.
如 long float lfNum;
...
...
scanf("%lf",&lfNum);

[]float 型的有效数字为7位.当多于7位时,第8位及以后的位将不准确,能够将其定义为long float型.

[]文档的输入出尽量采用fread fwrite函数.只有当另有用途时才用fprintf fscanf 函数.

[]对于数组及字符串的比较操作时要确认以''结束.


第七章:调试技术

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!