收藏 分享(赏)

gcc编译c问题.doc

上传人:hwpkd79526 文档编号:7127283 上传时间:2019-05-06 格式:DOC 页数:8 大小:44KB
下载 相关 举报
gcc编译c问题.doc_第1页
第1页 / 共8页
gcc编译c问题.doc_第2页
第2页 / 共8页
gcc编译c问题.doc_第3页
第3页 / 共8页
gcc编译c问题.doc_第4页
第4页 / 共8页
gcc编译c问题.doc_第5页
第5页 / 共8页
点击查看更多>>
资源描述

1、1、Linux C 语言编程错误解决之 “warning: the gets function is dangerous and should not be used.问题出在程序中使用了 gets Linux 下 gcc 编译器不支持这个函数,解决办法是使用 fgetsfgets()函数的基本用法为:fgets(char * s,int size,FILE * stream);/* 代码实现 */#include int main ( ) char crack820;printf(“n 输入任意字符 : “);fgets(crack8, 20, stdin);/stdin 意思是键盘输入fp

2、uts(crack8, stdout); /stdout 输出return 0;2、逻辑错误与语法错误在编程时,出现的错误可能有逻辑错误和语法错误两种。这两种错误的发生原因和处理方法是不同的。本节将讲述这两种错误的处理方法。逻辑错误指的是程序的设计思路发生了错误。这种错误在程序中是致命的,程序可能正常编译通过,但是结果是错误的。当程序正常运行而结果错误时,一般都是编程的思路错误。这时,需要重新考虑程序的运算方法与数据处理流程是否正确。语法错误:语法错误指的是程序的思路正确,但是在书写语句时,发生了语句错误。这种错误一般是编程时不小心或是对语句的错误理解造成的。在发生语句错误时,程序一般不能正常

3、编译通过。这时会提示错误的类型和错误的位置,按照这些提示改正程序的语法错误即可完成错误的修改。3、 C 程序中的错误与异常C 程序中的错误,根据严重程序的不同,可以分为异常与警误两类。在编译程序时,这两种情况对编译的影响是不同的,对错误与异常的处理方式是不同的。1什么是异常异常指的是代码中轻微的错误,这些错误一般不会影响程序的正常运行,但是不完全符合编程的规范。在编译程序时,会产生一个“警告” ,但是程序会继续编译。下面的程序会使程序发生异常,在编译时产生一个警告错误。? 在除法中, 0 作除数。? 在开方运算时,对负数开平方。? 程序的主函数没有声明类型。? 程序的主函数没有返回值。? 程序

4、中定义了一个变量,但是没有使用这个变量。? 变量的存储发生了溢出。2什么是错误错误指的是程序的语法出现问题,程序编译不能正常完成,产生一个错误信息。这时会显示错误的类型与位置。根据这些信息可以对程序进行修改。4、编译中的警告提示在编译程序时,如果发生了不严重的异常,会输出一个错告错误,然后完成程序的编译。例如下面的内容是一个程序在编译时产生的警告。5.1.c: In function main:5.1.c:16: 警告:main 的返回类型不是 int5.1.c:18: 警告:被零除这些的含义如下所示。(1) “In function main:”表示发生的异常在 main 函数内。(2) “

5、5.1.c:16:”表示发生异常的文件是 5.1.c,位置是第 16 行。(3)下面的信息是第 16 行的异常,表明程序的返回类型不正确。main 的返回类型不是 int(4)下面的警告信息表明程序的第 18 行有除数为 0 的错误。5.1.c:18: 警告:被零除1.8.4 找不到包含文件的错误程序中的包含文件在系统或工程中一定要存在,否则程序编译时会发生致命错误。例如下面的语句包含了一个不正确的头文件。#include 编译程序时,会发生错误,错误信息如下所示。5.1.c:2:20: 错误:stdio2.h:没有那个文件或目录1.8.5 错误地使用逗号程序中逗号的含义是并列几个内容,形成某

6、种算法或结构。程序中如果错误地使用逗号,会使程序在编译时发生致命错误。例如下面的代码,是程序中的 if 语句后面有一个错误的逗号。int max(int i,int j )if(ij),return(i);elsereturn(j);程序编译时输出的错误信息如下所示。表明 max 函数中逗号前面的表达式有错误,实际上的错误是多一个逗号。5.1.c: In function max:5.1.c:4: 错误:expected expression before , token5.1.c: In function max:1.8.6 括号不匹配错误程序中的引号、单引号、小括号、中括号、大括号等符号必

7、须成对出现。这方面的错误会使程序发生符号不匹配的错误。发生这种错误后,编译程序往往不能理解代码的含义,也不能准确显示错误的位置,而是显示表达式错误。例如下面的代码,在最后一行上了一个花括号。int max(int i,int j )if(ij)return(i);elsereturn(j);编译程序时,会显示下面的错误信息。5.1.c:22: 错误:expected declaration or statement at end of input1.8.7 小括号不匹配错误程序中的小括号一般在一行内成对出现并且相匹配。小括号不匹配时,程序发生致命错误。例如下面的代码,第一行多了一个右半边括号。

8、if(ij)return(i);elsereturn(j);编程程序时,会发生下面的错误。显示括号前面有错误,并且导致下面的 else 语句也有错误。5.1.c:4: 错误:expected statement before ) token5.1.c:8: 错误:expected expression before else1.8.8 变量类型或结构体声明错误程序中的变量或结构体的名称必须正确,否则程序会发生未声明的错误。例如下面的代码,用一个不存在的类型来声明一个变量。ch a;程序在运行时,会显示出这个变量错误,并且会显示有其他的错误。5.1.c:17: 错误:ch 未声明 (在此函数内第

9、一次使用 )5.1.c:17: 错误:( 即使在一个函数内多次出现,每个未声明的标识符在其5.1.c:17: 错误:所在的函数内只报告一次。)5.1.c:17: 错误:expected ; before a1.8.9 使用不存在的函数的错误如果程序引用了一个不存在的函数,会使用程序发生严重的错误。例如下面的代码,引用了一个不存在的函数 add。k=add(i,j);程序显示的错误信息如下所示,表明在 main 函数中的 add 函数没有定义。/tmp/ccYQfDJy.o: In function main:5.1.c:(.text+0x61): undefined reference to

10、addcollect2: ld 返回 15.8.10 大小写错误C 程序对代码的大小写是敏感的,不同的大小写代表不同的内容。例如下面的代码,将小写的“int”错误的写成了“Int”。Int t;程序显示的错误信息如下所示,表明“Int”类型不存在或未声明。发生这个错误时,会输出多行错误提示。5.1.c:16: 错误:Int 未声明 (在此函数内第一次使用)5.1.c:16: 错误:( 即使在一个函数内多次出现,每个未声明的标识符在其5.1.c:16: 错误:所在的函数内只报告一次。)5.1.c:16: 错误:expected ; before t1.8.11 数据类型的错误程序中的某些运算,必

11、须针对相应的数据类型,否则这个运算会发生数据类型错误。例如下面的代码,错误地将两个整型数进行求余运算。float a,b;a= a %b ;程序编译时,输出下面的错误,表明“%”运算符的操作数无效。5.1.c:19: 错误:双目运算符 % 操作数无效1.8.12 赋值类型错误任何一个变量,在赋值时必须使用相同的数据类型。例如下面的代码,错误地将一个字符串赋值给一个字符。char c;c=“a“;程序编译时的结果如下所示,表明赋值时数据类型错误。5.1.c:19: 警告:赋值时将指针赋给整数,未作类型转换1.8.13 循环或判断语句中多加分号分号在程序中的作用是表示一个语句结束。在程序的语句中用

12、一个单独的分号表示一个空语句。但是在循环或判断结构的后面,一个分号会导致程序的逻辑发生错误。关于这些结构的使用方法,后面的章节将会详细讲到。下面的程序,在 for 语句的后面,错误的添加了一个分号,导致程序不能正常地进行循环。#include main()int sum, j;sum=0;for(j=0;j 指定头文件搜索路径(注意是大写英文字母)如 gcc hello.c -I/root/gcc/ -o hello-L 指定库文件搜索路径如 gcc hello.c -L/root/gcc/lib -o hello上面 2 个都是指定路径,而不是文件。使用链接库 -l (小写)指定具体的库文件

13、,由于 linux 中库函数都是以 lib 开头的,这里的库文件只需填写 lib 之后的内容就可以如有静态库文件 libm。a ,则在调用是只需要填写-lm若是共享库 libm。so 也只是需填写-lm在调试阶段尽量不进行优化。嵌入式 linux 调试器 GDB 的使用1.进入 GDB 如 gdb tets2 查看文件 ,键入“l”或者“list” 3.设置断点 b 行号 如 b 6 在第 6 行加入断点4. 查看断点处情况 info b5 运行代码 r6. 查看变量 p 变量名 如(gdb)p n$1 = 0(gdb) p i $2 = 134518440GDB 在显示变量值时都会在对应值之

14、前加上“$N”标记,它是当前变量的引用标记,若要再次引用可用“$N”代替变量名7.观察变量 watch 变量名8.单步运行 n 9.程序继续运行 c 10 退出 GDB q常用 GDB 命令break + 设置断点的行号 tbreak + 行号或函数名 设置临时断点,到达后被自动删除 break + filename + 行号 用于指定文件的对应行设置断点break + 行号 + if +条件clear + 要清除断点行号delete + 要清除的断点编号disable + 断点编号 使断点失效enable + 断点编号 使能断点print 或 p + 变量或表达式finish 一直运行到函数

15、返回make 工程管理vi Makefile 或者 vi makefile 目标体 target 依赖文件 dependency_file 运行的命令 command#后面表示注释格式target :dependency_filecommand注意每一个 command 前必须有“tab”符,否则会出错例子:#The simplest exampleedit : main.o kbd.o command.o display.o insert.o search.o files.o utils.ogcc -o edit main.o kbd.o command.o display.o insert

16、.o search.o files.o utils.omain.o : main.c defs.hgcc -c main.c -o mainkbd.o : kbd.c defs.h command.hgcc -c kbd.c -o kbd.ocommand.o : command.c defs.h command.hgcc -c command.c -o command.odisplay.o : display.c defs.h buffer.hgcc -c display.c -o display.oinsert.o : insert.c defs.h buffer.hgcc -c inse

17、rt.c -o insert.osearch.o : search.c defs.h buffer.hgcc -c search.c -o search.o files.o : files.c defs.h buffer.h command.hg cc -c files.c -o file.outils.o : utils.c defs.h gcc -c utils.c -o utils.o clean :rm edit main.o kbd.o command.o display.o insert.o search.o files.o utils.oMakefile 变量VAR = var使

18、用变量格式:$(VAR)例子:OBJS = main.o kbd.o command.o display.o insert.o search.o files.o utils.oedit : $(OBJS)gcc -o edit $(OBJS)main.o : main.c defs.hgcc -c main.ckbd.o : kbd.c defs.h command.hgcc -c kbd.ccommand.o : command.c defs.h command.hgcc -c command.cdisplay.o : display.c defs.h buffer.hgcc -c disp

19、lay.cinsert.o : insert.c defs.h buffer.hgcc -c insert.csearch.o : search.c defs.h buffer.hgcc -c search.cfiles.o : files.c defs.h buffer.h command.hgcc -c files.cutils.o : utils.c defs.hgcc -c utils.cclean :rm edit $(OBJS)makefile 中常见自动变量$ 目标文件的完整名称$ 所有不重复依赖文件,以空格分开例子:OBJS = main.o kbd.o command.o display.o insert.o search.o files.o utils.oedit : $(OBJS)gcc $ -o $

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报