不能通编译过的程序实际上还不是合法的程序,因为它不满足C语言对于程序的基本要求。
检查语法错误的第一要义:集中力量检查系统发现的第一个错误,弄清并改正它。
在编译过程中系统发现的错误主要有两类:基本语法错误和上下文关系错误。这些错误都在表面上,可以直接看得见。也是比较容易弄清,比较容易解决的。关键是需要熟悉C语言的语法规定和有关上下文关系的规定,按照这些规定检查程序正文,看看存在什么问题。
编译中系统发现错误都能指出错误的位置。不同系统在这方面的能力有差异,在错误定位的准确性方面有所不同。有的系统只能指明发现错误的行,有的系统还能够指明行内位置。
一般说,系统指明的位置未必是真实错误出现的位置。通常情况是错误出现在前,而系统发现错误在后,因为它检查到实际错误之后的某个地方,才能确认出了问题,因此报出错误信息。要确认第一个错误的原因,应该从系统指明的位置开始,在那里检查,并从那里开始向前检查。
系统的错误信息中都包含一段文字,说明它所认定的错误原因。应该仔细阅读这段文字,通常它提供了有关错误的重要线索。但也应该理解,错误信息未必准确,有时错误确实存在,但系统对错误的解释也可能不对。也就是说,在查找错误时,既要重视系统提供的错误信息,又不应为系统的错误信息所束缚。
发现了问题,要想清楚错误的真正原因,然后再修改。不要蛮干。在这时的最大诱惑就是想赶快改,看看错误会不会消失。但是蛮干的结果常常是原来的错误没有弄好,又搞出了新的错误。
另一个值得注意的地方:程序中的一个语法错误常常导致编译系统产生许多错误信息。如果你改正了程序中一个或几个错误,下面的弄不清楚了,那么就应该重新编译。改正一处常常能消去许多错误信息行。
解决语法错误
常见语法错误:
1)缺少语句、声明、定义结束的分号。
2)某种括号不配对。C语言中括号性质的东西很多,列举如下:
( ), [ ], { }, ' ', " ", / /
在不同位置的括号不配对可能引起许多不同的错误信息。
3)关键字拼写错误。
较难认定的典型错误:
1)宏定义造成的错误。这种东西不能在源程序文件中直接看到,是在宏替换之后出现的。常见的能引起语法错误的宏定义错误:宏定义中有不配对的括号,宏定义最后加了不该有的分号,……
解决上下文关系错误
1)变量没有定义。产生这个问题的原因除了变量确实没有大意外,还可能是变量的拼写错误,变量的作用域问题(在不能使用某个变量的地方想去用那个变量)。
2)变量重复定义。例如在同一个作用域里用同样名字定义了两个变量,函数的局部变量与参数重名等。
3)函数的重复定义。可能是用同一个名字定义了两个不同的函数。或者是写出的函数原型在类型上与该函数的定义不相符。有时没有原型而直接写函数调用也可能导致这种错误信息,因为编译程序在遇到函数调用而没有看到函数原型或函数定义时,将给函数假定一个默认原型。如果后来见到的函数定义与假定不符,就会报告函数重复定义错误。
4)变量类型与有关运算对运算对象或者函数对参数的要求不符。例如有些运算(如 %)要求整数参数,而你用的是某种浮点数。
5)有些类型之间不能互相转换。例如你定义了一个结构变量,而后要用它给整数赋值。系统容许的转换包括:数值类型之间的转换,整数和指针之间的转换,指针之间的转换。其余转换(无论是隐含的,还是写出强制)都不允许。参见《C语言程序设计》(K&R)197-199页。
如何看待编译警告
当编译程序发现程序中某个地方有疑问,可能有问题时就会给出一个警告信息。警告信息可能意味着程序中隐含的大错误,也可能确实没有问题。对于警告的正确处理方式应该是:尽可能地消除之。对于编译程序给出的每个警告都应该仔细分析,看看是否真的有问题。只有那些确实无问题的警告才能放下不管。
注意:经验表明,警告常常意味着严重的隐含错误。
常见警告:
1)(局部自动)变量没有初始化就使用。如果对局部指针变量出现这种情况,后果不堪设想。对于一般局部自动变量,没有初始化就使用它的值也不会是有意义的。
2)在条件语句或循环语句的条件中写了赋值。大部分情况是误将 == (等于判断)写成 = 了。这是很常见的程序错误,有些编译程序对这种情况提出警告。
第一点,“照搬照抄式的拼程序,没有了现成现成程序参考自己就无从下手”。在学习别人程序的基础上,要总结别人的经验,读懂别人处理问题的方法,并且把其中可以更改的部分更改下试一试效果有什么不同,试验得多了那些知识你就掌握了。
第二点,“掌握VC本身提供的大量现成功能函数和定义的关键字”。正如第一点说的,要多看例程代码,记住所有的函数是比较难的。关键是记住“要用到的”就可以了。有很多编程辅助工具是可以借鉴的,比如Visual assist X,MSDN,遇到新知识点时,多参考MSDN;
第三点,“自己想实现的功能,能否在VC庞大的函数库中大海捞针,找到对应现成的函数”。编程,就是把问题细化,最终细化到你可以解决的地步。就像造火车,最后细化到每个零件,问题就迎刃而解了。
第四点,“基础和关键”。基础,你把问题分解到最后那部分所需要的知识就是基础;关键,就是如何解决这些最基本问题的步骤
第五点,“VS2005版VC与VC6”,VS2005默认是Unicode环境,而VC60默认是多字节环境。可以按VS2005工程向导做几个程序,研究下工程设置和代码编写,熟悉一下区别。
给你一份Unicode编程的资料,多练习吧。
在VC60下设置Unicode编译环境 收藏
VC++ 60支持Unicode编程,但默认的是ANSI,所以开发人员只需要稍微改变一下编写代码的习惯便可以轻松编写支持UNICODE的应用程序。
使用VC++ 60进行Unicode编程主要做以下几项工作:
1、为工程添加UNICODE和_UNICODE预处理选项。
具体步骤:打开[工程]->[设置…]对话框,在C/C++标签对话框的“预处理程序定义”中去除_MBCS,加上_UNICODE,UNICODE。(注意中间用逗号隔开)
在没有定义UNICODE和_UNICODE前,所有函数和类型都默认使用ANSI的版本;在定义了UNICODE和_UNICODE之后,所有的MFC类和Windows API都变成了宽字节版本了。
2、设置程序入口点
因为MFC应用程序有针对Unicode专用的程序入口点,我们要设置entry point。否则就会出现连接错误。
设置entry point的方法是:打开[工程]->[设置…]对话框,在Link页的Output类别的Entry Point里填上wWinMainCRTStartup。
3、使用ANSI/Unicode通用数据类型
微软提供了一些ANSI和Unicode兼容的通用数据类型,我们最常用的数据类型有_T ,TCHAR,LPTSTR,LPCTSTR。
顺便说一下,LPCTSTR和const TCHAR是完全等同的。其中L表示long指针,这是为了兼容Windows 31等16位 *** 作系统遗留下来的,在Win32 中以及其它的32位 *** 作系统中,long指针和near指针及far修饰符都是为了兼容的作用,没有实际意义。P(pointer)表示这是一个指针;C (const)表示是一个常量;T(_T宏)表示兼容ANSI和Unicode,STR(string)表示这个变量是一个字符串。综上可以看出, LPCTSTR表示一个指向常固定地址的可以根据一些宏定义改变语义的字符串。比如:
TCHAR szText=_T(“Hello!”);TCHAR szText[]=_T(“I Love You”);LPCTSTR lpszText=_T(“大家好!”);使用函数中的参数最好也要有变化,比如:
MessageBox(_T(“你好”)); 其实,在上面的语句中,即使您不加_T宏,MessageBox函数也会自动把“你好”字符串进行强制转换。但我还是推荐您使用_T宏,以表示您有Unicode编码意识。
4、修改字符串运算问题
一些字符串 *** 作函数需要获取字符串的字符数(sizeof(szBuffer)/sizeof(TCHAR)),而另一些函数可能需要获取字符串的字节数sizeof(szBuffer)。您应该注意该问题并仔细分析字符串 *** 作函数,以确定能够得到正确的结果。
ANSI *** 作函数以str开头,如strcpy(),strcat(),strlen();
Unicode *** 作函数以wcs开头,如wcscpy,wcscpy(),wcslen();
ANSI/Unicode *** 作函数以_tcs开头 _tcscpy(C运行期库);
ANSI/Unicode *** 作函数以lstr开头 lstrcpy(Windows函数);
考虑ANSI和Unicode的兼容,我们需要使用以_tcs开头或lstr开头的通用字符串 *** 作函数。
六、举个Unicode编程的例子
第一步:
打开VC++60,新建基于对话框的工程Unicode,主对话框IDD_UNICODE_DIALOG中加入一个按钮控件,双击该控件并添加该控件的响应函数:
void CUnicodeDlg::OnButtonUnicode() 添加静态文本框IDC_DISP,使用ClassWizard给该控件添加CString类型变量m_disp。使用默认ANSI编码环境编译该工程,生成Unicodeexe。
第二步:修改系统内码
打开“控制面板”,单击“日期、时间、语言和区域设置”选项,在“日期、时间、语言和区域设置”窗口中继续单击“区域和语言选项”选项,d出“区域和语言选项”对话框。在该对话框中,单击“高级”标签,将“非Unicode的程序的语言”选项改为“日语”,单击“应用”按钮,
d出的对话框单击“是”,重新启动计算机使设置生效。
运行Unicodeexe程序并单击“Button1”按钮,看,静态文本框出现了乱码。
第三步:
改为Unicode编码环境编译该工程,生成Unicodeexe。再次运行Unicodeexe程序并单击“Unicode”按钮。看到Unicode编码的优势了吧。
说实话我没弄明白你这个程序想干什么,定义了一个没有跳出的递归调用order,其结果是一直调用自身,不过此程序中它不会被运行到,因为最初没有函数会去调用它,这里应该是一个警告吧。
至于无法编译应该是因为main函数中x,y没被定义,在order中形参的定义对于main中的变量是无效的。
如果是记事本
在记事本程序里面
文件〉打开 你的文本文件
选择路径的时候,下面有编码的选择
可以选择unicode
问题应该就可以解决了
如果都有问题,参考下面的
Microsoft Applocale
开放分类: 软件、内码
一款由微软出品的解决乱码的软件
大家在使用台湾或是香港等地的软件特别是游戏的时候常遇到的问题就是乱码。
微软为XP专门制作了Microsoft AppLocale这款软件,用来解决汉字的编码问题。
Microsoft AppLocale实际上是以其他编码(如BIG5)的兼容模式来运行程序,所以一般的程序都能很好的运行。
相比南极星等其他内码转换,Microsoft AppLocale的使用更为方便,翻译得更好一些,一般不会出现程序被编译后原来的乱码变正常但是原来的正常文字又变乱码的情况(亲身体会)
使用时运行Microsoft AppLocale,它会提示找到需要以兼容模式运行的程序,打开后就能正常运行,也可以创建相应的快捷方式,这不影响程序本身。
------------------------------------------------
[注意事项]
该软件存在漏洞
安装AppLocale后,AppLocale会在 Windows\AppPatch 文件夹中生成“apploctmp”文件,该文件可能会造成 Windows lnstaller 程序运作错误,导致其安装界面变成乱码,软件安装后,其菜单部分也会出现乱码,注册表信息出现错误,严重者会造成安装的程序无法运行。
解决的方法:如果安装AppLocale后,你还没有运行过AppLocale,那么请在Windows\AppPatch文件夹中用记事本建立一个文本文件,文件名“apploctmp”并将其属性设置为“只读”,既可阻止AppLocale产生新的“apploctmp”。如果已经运行过 AppLocale,那就删除“apploctmp”这个文件,然后按照上述方法重新建立一个即可。(此法在部分软件的安装过程中仍会出现部分乱码)
根治的方法:用Uedit32打开apploctmp 用16进制编辑,将内容改为03 03 00 00 保存,并将其属性设置为“只读”。(此法不会出现乱码)
(目前尚无官方补丁)
大家也可以安装网友修改过的pAppLocale来使用,绝对不会出现以上问题。
来这里下载Microsoft AppLocale Utility:>
1、编写阶段——程序设计语言
java是程序设计语言
2、编译阶段——程序处理语言
程序处理语言包含编译器,解释器。它的作用就是把程序设计语言翻译成目标语言。
以上两者的关系就是“语言”和“翻译者”的关系。在使用语言时,我们只能说,使用这种语言去书写一段程序。编译器则是能够将某种语言的源程序进行翻译,然后生成目标程序。
不同的设计语言有不同的编译器。我们通常会说,某个编译器支持了什么语言,正如一个翻译者只懂翻译英语,法语,但是不会日语,所以翻译不了日语一样,这个编译器只识别能识别得语言并翻译这种语言。
3、运行,调试 阶段
在程序的运行阶段则是在一个特定的平台上,由这个平台来执行编译生成的程序。编译器的作用就是沟通源程序和程序的运行平台。源程序相对于一个运行平台来说是不可识别的,但当编译器将源程序编译成为这个平台所能够识别的目标语言以后,程序就可以在这个平台上运行了。Java虚拟机是一个平台,DOS 和 Windows 也是平台。
jvm
上面三个概念中已经指出了程序从源代码到运行的三个必经阶段:编码——编译——运行,调试。
所有的高级语言都需要进过这三个阶段。
JAVA的特殊特殊在哪里?——在编译阶段。
一次编译是宏观的一次编译
1、JAVA的编译过程:
2、分解过程
第一步:Java源代码——CLASS文件字节码,是java的第一次编译。生成的这个class文件就是可以到处运行的文件。
第二步:Java字节码——到目标机器代码;执行是由JVM执行引擎来完成,JAVA的第二次编译。
2、到处运行的隐含条件——这里的“到处”的前提是“装有JVM”。
总结:
java编译器把我们编写的代码,编译成class文件只要 *** 作系统里又jvm 就可以运行
将IME启用就行了:
右键点击开始——计算机管理——“系统工具”——“任务计划程序”——“任务计划程序库”——“Microsoft”——“Windows”——“TextServicesFramework”菜单项,在窗口的右侧找到“MsCtrMonitor”项,右键点击MsCtrMonitor项,从其右键菜单中选择“运行”项。具体见下面图示:
以上就是关于程序编译错误不知道是什么原因全部的内容,包括:程序编译错误不知道是什么原因、把VS2005设置为unicode之后出现了问题。、我这个C语言程序为什么不能编译等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)