在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 <stdlib.h> #include <iostream.h> int main(int argc, char* argv[]) { const double Pi = 3.14; double dRadius = 3; if (argc > 1) { dRadius = atof(argv[1]); } cout<<"你输入的半径为: "<<dRadius<<endl; Circular *circular = new Circular(Pi); double dArea = circular->getArea(dRadius); cout<<"面积为:"<<dArea<<endl; double dCircumference = circular->getCircumference(dRadius); cout<<"周长为:"<<dCircumference<<endl; 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<<"你输入的半径为: "<<dRadius<<std::endl;
VC6:
#include <stdlib.h> // vc6 - atof() #include <iostream.h> // vc6 - cout // vc6 - endlVC10:
// vc10 - cout & endl using namespace std; #include <iostream>
// testCir2.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "Circular.h" //#include <stdlib.h> // vc6 // atof() //#include <iostream.h> // vc6 // count & endl using namespace std; // vc10 #include <iostream> // 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<<"你输入的半径为: "<<dRadius<<endl; //vc6 // C2065: 'cout' and 'endl' : undeclared identifier Circular *circular = new Circular(Pi); double dArea = circular->getArea(dRadius); cout<<"面积为:"<<dArea<<endl; double dCircumference = circular->getCircumference(dRadius); cout<<"周长为:"<<dCircumference<<endl; 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); }