vc6.0调试悖论。

vc6.0调试悖论。
疑问:(悖论如下)
1.有错不能生成exe文件。
2.不生成exe文件就不能用断点和单步运行功能。
3.所以有错了,不能用断点和单步来找错。

示例:建立一project叫test1,在dialog中加一按钮Button1;
代码如下 :
(1)void CTest1Dlg::OnButton1()
{
(2) 3MessageBox("2dklsdkld");
}(2)中前面的3是故意加的error.同时在此行设断点,结果按F5后并不在断点处停下,而且

按F10也不管用,只是提示exe 文件不存在,问要不要build 它,可build 完后只在下面的build 视

图里说明test1.exe - 2 error(s), 0 warning(s)而并不建立exe文件。

如果把(2)中的'3'去掉,则断点与单步运行都可用了,但同样先要生成exe文件。
请问这是哪错了???????

首先,函数名必须是C语言合法的标识符,标识符不能以数字开头而只能以字母或者下划线开头,3MessageBox不是C语言合法的标识符(编译器会认为3是个数字,提示MessageBox前没发现分号),这是个编译错误。
其次,(如果去掉3)编译的时候没发现MessageBox的函数声明应该会有一个编译警告,链接的时候找不到函数地址,这是一个链接错误,因为有链接错误所以不能生成exe文件,没有exe当然不能调试。
程序调试是让你来找出代码中的逻辑错误的,语法错误直接从编译链接错误提示中找原因排除。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-05-08
程序错误大体分两种:语法错误和运行错误。
按程序生成的阶段,可分为编译错误,链接错误和运行错误。
语法错误可以导致编译错误,一些语法错误还可以导致连接错误。而在程序中读写空指针会导致运行错误,而不会导致编译和链接错误。

您第一步说的“有错不能生成exe文件”中的“有错”应该是语法错误,这时编译器无法继续生成目标文件,只好停下来了。如果您是第一次编译这份代码,也就是说,以前没有成功生成过可执行文件,那么VC当然找不到了。

另一方面,断点和单步调试都是针对运行错误的,也就是说,在代码无语法错误的前提下,查找程序的逻辑错误,前提是已经有了可运行的.exe文件。当您认为程序编写完毕运行后却发现程序不按自己的流程运行,或出现运行时错误(Runtime error),那么就要单步调试或下断点了。

综上,调试悖论是不成立的,不过说实在的,VC的这个对话框确实应该改进一下。
相似回答