注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

_

_

 
 
 

日志

 
 

VC++2003 から 2008 への移行に付随する問題  

2013-12-11 15:16:46|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

VC++2003 から 2008 への移行に付随する問題 ?

バージョンアップによって色々と仕様が変わって、前まで動いていたものが動かなくなるというのは残念ながらよくあること。 VC++2003 から 2008 に移行する時に発生した問題の記録。



winnt.h で謎のエラー ?

2003でビルドできたソリューションを2008でビルドしようとしたら、以下のエラーを筆頭に、たくさんエラーが出た。

error C2146: 構文エラー : ';' が、識別子 'PVOID64' の前に必要です。

なんのこっちゃと思ってエラーをクリックすると、winnt.h というファイルが開いた。自分は直接インクルードしていないヘッダだ。 原理はよくわからないが、ネットで調べたところ winnt.h に対して以下のような修正を行えばコンパイルできるようになるらしい。

typedef void * POINTER_64 PVOID64;
     ↓
typedef void * POINTER_64, * PVOID64;

pow( int, int ) が許されない ?
pow( 10, 3 );

みたいな記述をしていたのだが、これが以下のようなエラーを吐いた。

error C2668: 'pow' : オーバーロード関数の呼び出しを解決することができません。(新機能 ; ヘルプを参照)

なんでも2005からISO標準に準拠するために色々と仕様が変わっているらしく、pow( int, int ) のオーバーロードがなくなっているそうだ。むしろ ( int, int ) は標準であってもいいのに。

関数ポインタには&をつけないといけない ?

メソッドへのポインタの部分で、以下のようなエラーが出た。

error C3867: 'GENETOS_View::task_Bomb': 関数呼び出しには引数リストがありません。メンバへのポインタを作成するために '&GENETOS_View::task_Bomb' を使用してください

C言語では関数ポインタに&はつけないが、C++のメソッドポインタは「&クラス名::メソッド名」と書かなくてはならないらしい。 そのC++の仕様に準拠するため、VC2005からは&をつけないとエラーになるそうだ。

rcファイルで afxres.h を開けない ?

リソースファイル関連で以下のエラーが出た。

fatal error RC1015: cannot open include file 'afxres.h'

ウェブ上のドキュメントによれば、rcファイルの中のinclude文を以下のように書きかえれば対処できるらしい。

#include "afxres.h"
  ↓
#include <windows.h>
#define IDC_STATIC -1

sprintf とか使うと警告が出る ?

sprintf や strcpy などのCRT(Cランタイム)関数を使ってると、危ないよってことで警告が出る。

warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

まあそりゃ危ないけどさ、そこはC++だからさ…。 sprintf は多用していたので警告がたくさん出てビビった。 2005以降からは、セキュリティ強化版の sprintf_s などが用意されているらしいから、そちらを使うべきなんだそうだ。

ちなみに、全部置換すんの面倒くせーよ!って人は、以下の記述をすれば警告を消せる。

#define _CRT_SECURE_NO_DEPRECATE

なりふり構ってられないなら、直接

#pragma warning ( disable : 4996 )

って手もあるけどナンセンス。

fstream で日本語を含むパスが読めなくなる ?

なんか VC++2005 からデフォルトの文字コードが Unicode になってるとかうんぬん。 ちゃんとロケールの設定を行ってやらないと、日本語を含むファイルが fstream で読み込めなかったりする。

//ロケールの設定
std::locale::global( std::locale( "japanese" ) );
  评论这张
 
阅读(1159)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017