有时候程序crash了,但是不能定位具体的exception在哪里throw的(因为可能函数调用很深,并且有很多try--catch),举个简单的例子:
class Test { public: Test(int i) : m_i(i) {} void f() { cout << m_i << endl; throw new Test(6); } private: int m_i; }; void f1() { try { Test* pT = new Test(0); pT->f(); } catch (...) { cout << "exception is caught in f1!" << endl; throw; } }
void f2() { try { f1(); } catch (...) { cout << "exception is caught in f2!" << endl; throw; } }
int _tmain(int argc, _TCHAR* argv[]) { try { f2(); } catch (...) { cout << "exception is caught in main!" << endl; }
? ? ? ? return 0;
}
因为你一开始可能并不知道在哪里设breakpoints,所以F5以后,程序会直接stop到main()函数的最后一行,还是查不出具体的问题在哪里。有下面两个方法可以定位exception在哪里:
在VS的菜单Debug--->Exceptions中把一些exceptions打上勾(default一般都不勾),在上面这个特殊例子中,因为我throw了一个自己定义的exception类Test,所以需要把Test这个exception加入到Exceptions dialog中去(click "Add", 在New Exceptions dialog中Name设为"Test",就可以加入了,然后在Exceptions dialog中把Test这个exception勾上)。此时直接F5,程序会stop在f()中 “throw new Test(6);”这一行。(实际项目中根据实际情况,勾选相应的exceptions,如果全勾上,比较保险,但是会有很多不必要的exception会stop下来,根据经验,一般c++ project中,我只勾选Win32 Exceptions,如果不行,再勾选一些别的exceptions)将保护f2()的try--catch暂时去除(一般去除的是真正处理exception的那个try---catch,而不是中间过程的那些try---catch,因为中间过程很多的try---catch可能仅仅是把catch到exception重新throw到外层,而不是真正处理),然后F5,程序也会stop在f()中 “throw new Test(6);”这一行。 实际项目可以灵活应用这两个方法。
今天在学习C语言的时候,出现了一系列报错,如下图所示。
原因
产生此类错误的原因,是因为C语言在定义局部变量的时候,必须将局部变量定义在函数前面,或者局部空间的起始位置。C原因对局部变量的要求比较严格。
解决办法
1,第一个方法,将源文件的后缀名改为.cpp文件,因为在C++中可以随意定义变量,而.cpp是c++语言的源程序,c++兼容c语言的绝大部分语法特性。
2,第二个方法,找到变量定义的位置,将变量定义在函数的起始位置。
演示如下图所示
?错误提示
?解决办法
?
利用VS2010编译C语言代码,遇到的问题及解决方法如下:
1???error C2143: 语法错误 : 缺少“;”(在“类型”的前面)
解决方法:
原因:【C】error C2143: 语法错误 : 缺少“;”(在“类型”的前面)
实质上,纯c要求局部变量定义必须在函数或局部空间的开头,然后才能有其他语句。纯c确实对变量声明的位置有要求,c++却可以随用随定义的。 说明vs是严格执行了纯C的标准。变量任意定义是C99的标准。这是C89的标准,C99也没有这个限制。问题是微软拒绝支持C99(包括VS2012),一股当年IE6的作风。可以用/tp参数把程序作为C++代码编译,就可以通过了。或者,根本没有这么麻烦,将int b拉到最顶,就没事了。
就是要你完成所有局部变量的定义,你才能写代码。
?将局部变量的定义移动至函数开头即可。
?
2?“F_OK”: 未声明的标识符
解决方法:?
搜索关键词: F_OK,找到以下链接
access函数
模仿其代码,增加宏定义:
#define F_OK 0 /* Test for existence. */
?
3?无法解析的外部符号 localtime_r
localtime、localtime_s、localtime_r的使用
其中有以下:
localtime_r也是用来获取系统时间,运行于linux平台下。localtime_s也是用来获取系统时间,运行于windows平台下,与localtime_r只有参数顺序不一样
将
?localtime_r(&cur_time, &now);
改为?
localtime_s(&now,&cur_time);
并增加相应的头文件。
类似的还有将 sleep()改为Sleep。
C语言中的Sleep函数用法