当前位置:科技动态 > vs2008 c 变量_解决VS 2008 2010 2012 断点 失效 以及 变量 调试 无法 查看

vs2008 c 变量_解决VS 2008 2010 2012 断点 失效 以及 变量 调试 无法 查看

  • 发布:2023-09-19 22:18

本人用vs2008写C语言程序

新建cpp文件,但是强行把文件名命名为.c。

但是编译时出了很奇怪的问题。

int main() { ?? ?printf("d\n") ?? ?int endt = 0; ?? ?scanf("%d",&endt); ?? ?return 0; }

报错:

1>f:\code\auguest_c\auguest_c\main.c(21) : error C2143: syntax error : missing ';' before 'type' 1>f:\code\auguest_c\auguest_c\main.c(22) : error C2065: 'endt' : undeclared identifier

最后发现,把endt的定义挪到最前面就可以了。

?

正确版本:

int main() { ?? ?int endt = 0; ?? ?printf("d\n") ?? ?scanf("%d",&endt); ?? ?return 0; }

?

问题根源:编译器问题——C89和C99

C89规定,在任何执行语句之前,在块的开头声明所有局部变量。

在C99以及C++中则没有这个限制,即在首次使用之前,可在块的任何位置都可以声明变量。

?

1.源文件保存为.c格式的话变量只能定义在最前,若保存为.cpp格式的话,变量定义较为灵活,不用在最前。

2.在C语言里,变量只能在函数的开头处声明和定义。在函数里要用到的变量必须要在开头处声明定义。声明定义的前面不能有任何其他非声明定义的语句。全局变量在函数体的外部声明定义。而C++里(.CPP文件是按C++标准编译的),只要在用到变量前对该变量进行声明定义就行了,位置不做特别要求。而C语言的就定了在一个模块里(函数、循环体等)先声明一切所需变量后才能进行相关操作的规定。

?

?

?

计算机 -> 属性 -> “高级系统设置” -> “环境变量”中添加如下变量: %Path%=Path=c:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE;D:\Program Files\Microsoft Visual Studio 9.0\VC\BIN;C:\Program Files\Microsoft Visual Studio9.0\Common7\Tools;C:\WINDOWS\www.sychzs.cn\Framework\v3.5;C:\WINDOWS\www.sychzs.cn\Framework\v2.0.50727;C:\Program Files\Microsoft Visual Studio 9.0\VC\VCPackages;(Path不需要新建)

%include%=C:\Program Files\Microsoft Visual Studio 9.0\VC\include;(需要新建)

%lib%=C:\Program Files\Microsoft Visual Studio 9.0\VC\lib;

(之后就可以在命令行中使用cl了(win+R 输入cmd,键入 cl)

VS2008按F5无法在断点处停留,主要有以下几种情况:1、在配置-》通用配置-》调试里边把command line、command argument、working dir设置好。并且把该工程设置为启动项,否则断点可能无效。

2、调试时到“附加到进程”菜单里看有没有“aspnet_wp.exe”的进程,如果没有,添加。(只是针对C#)3、控件的事件丢失。这个比较常见。

4、右键解决方案的属性里,看生成项里的“生成调试信息”那里是不是FALSE,如果是,改成TRUE。

5、想要调试的代码行根本不能调试。这个比较少见。6、在工具-> 选项->调试->常规中有个选项,要求源文件与原始版本完全一致,默认的是选中的,取消试试。7、如果是dll工程,把项目属性-〉常规-〉输出目录,设置为调用该dll的exe所在的目录,同时把链接器-〉调试-〉生成调试信息 设为是/DEBUG,重新编译调试看能否起效。8、dll断点失效,可以先重新编译下试试看,不行的话找到刚刚的dll输出的目录,看看是否有pdb文件生成,项目属性-〉链接器-〉调试-〉生成程序数据文件,可以设置pdb输出路径。让pdb和dll都生成在工作目录下。9、如果还不行,用depends工具查看该exe是否调用了你的dll,Release版的exe调用Release的dll,debug也是,可能你的exe就是release版的,它是不会调用xxxxxxd.dll的,所以无法调试,反之亦然。解决方法就是选用和exe版本一致的dll进行调试。10、症状:有的变量可以查看,大部分不行。在工程右键-》属性-》C/C++-》代码优化,改为已禁用(/Od),可以查看了。11、今天静态库断点又失效了,排查结果是:为了方便我把静态库提取到一个文件夹里用,调用该静态库的dll,链接的是我提取的静态库,而不是工程里生产的静态库。解决办法:dll工程右键-》C/C++-》附加包含目录,改为静态库源码头文件路径,右键-》连接器-》附加库目录,改为静态库工程生成静态库的路径。根据依赖,从前到后把lib都重新编译,最后编译dll,debug,断点OK了。?总结:断电失效无非以下几种情况:1、“要求源文件与原始版本完全一致”钩子没有取消2、pdb文件没生成,这个要求你断点位置所在源码的工程的pdb必须有。3、不管是exe、静态库还是动态库的工程,依赖的库不对,要么是路径不对,要么是旧库(没有pdb的)4、改完设置,忘了重新编译。?

相关文章