在vs2010中编译一个普通的C++程序(Win32 Console Application),都会出现这两个错误!
究其原因是:我们已经习惯了VC6的种种简陋和不规范!
例如,下列程序在VC6中编译通过。
主程序:testCir2.cpp
// testCir2.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "circular.h"
#include
#include
int main(int argc, char* argv[])
{
const double Pi = 3.14;
double dRadius = 3;
if (argc > 1) {
dRadius = atof(argv[1]);
}
cout<
Circular *circular = new Circular(Pi);
double dArea = circular->getArea(dRadius);
cout<
double dCircumference = circular->getCircumference(dRadius);
cout<
return 0;
}
但是在vc10中就会出现:
1. C2664: 'atof' : cannot convert parameter 1 from '_TCHAR *' to 'const char *'
dRadius = atof(argv[1]); // vc6 // C2664: 'atof' : cannot convert parameter 1 from '_TCHAR *' to 'const char *' 原因是:VC10中使用了unicode定义的变量;我们的MBCS定义的函数无法进行转换工作。
TCHAR.H routine
_UNICODE & _MBCS not defined
_MBCS defined
_UNICODE defined
_tstof
atof
atof
_wtof
_ttof
atof
atof
_wtof
更改为:
dRadius = _wtof(argv[1]); 即可解决C2664错误。
2. C2065: 'cout' : undeclared identifier
C2065: 'endl' : undeclared identifier
我们经常使用的cout和endl怎么变成了不识别的了?
原因是:VC10给标准函数使用了命名空间。
解决方法有2种:
(1) 强制使用命名空间
using namespace std;
(2) 在标准函数前加前缀
std::cout<
最后,要注意引用的不同:
VC6:
#include // vc6 - atof()
#include // vc6 - cout // vc6 - endl VC10:
// vc10 - cout & endl
using namespace std;
#include
更改完的主程序(在VS2010运行通过)
// testCir2.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "Circular.h"
//#include // vc6 // atof()
//#include // vc6 // count & endl
using namespace std; // vc10
#include // vc10
int _tmain(int argc, _TCHAR* argv[])
{
const double Pi = 3.14;
double dRadius = 3;
if (argc > 1) {
//dRadius = atof(argv[1]); // vc6 // C2664: 'atof' : cannot convert parameter 1 from '_TCHAR *' to 'const char *'
dRadius = _wtof(argv[1]);
}
cout<
Circular *circular = new Circular(Pi);
double dArea = circular->getArea(dRadius);
cout<
double dCircumference = circular->getCircumference(dRadius);
cout<
return 0;
}
--------------------------------------------------------------xiaobin_hlj80--------------------------
附:类文件
头文件:circular.h
// circular.h: interface for the Circular class.
//
//
#if !defined(AFX_CIRCULAR_H__612399AD_E8A7_433A_BD63_6C1F29BAC83E__INCLUDED_)
#define AFX_CIRCULAR_H__612399AD_E8A7_433A_BD63_6C1F29BAC83E__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class Circular
{
public:
Circular(double pi);
virtual ~Circular();
double PI;
double getArea(double radius);
double getCircumference(double radius);
};
#endif // !defined(AFX_CIRCULAR_H__612399AD_E8A7_433A_BD63_6C1F29BAC83E__INCLUDED_)
源文件:circular.cpp
// circular.cpp: implementation of the Circular class.
//
//
#include "stdafx.h"
#include "circular.h"
//
// Construction/Destruction
//
Circular::Circular(double pi)
{
PI = pi;
}
Circular::~Circular()
{
}
double Circular::getArea(double radius) {
return PI * (radius * radius);
}
double Circular::getCircumference(double radius) {
return PI * (radius * 2);
}