Linuxを中心とした話題を投稿予定。 使用ディストリビューションであるFedoraが中心になると思われます。http://oedipa.wiki.fc2.com/にてTips Wikiを公開してます。
スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
[プログラミング][C++]これはバグ・・・?[追記あり]
今会社でせっせこツールを作成しております。

で、言語としてはC/C++ってことで、VC++6.0(ちょっと古いっすよねぇ・・・^^;)で開発を行っているのですが、昨日ちと不可解な現象に出くわしました。

私の解釈が間違っていなければ、次のコードは正しいはず。

for(int i=0; i<nSize; i++)
{
snip...
}

snip...

for(int i=0; i<nSize; i++)
{
snip...
}


実際、VC++2005EEではこの手の書き方で問題ありませんでした(メモリとか実行速度効率の是非はともかく)。

が、VC++6.0だと
"iが多重定義されています。"
ってな旨のコンパイルエラーが発生します。上の例では、下のforブロックのiの定義を消してやればコンパイルが通ります。

まぁ実際、ただのループ用一時変数なので関数の頭で宣言したって構いはせんのですが、なんとなく釈然としないんですよねぇ。確かC++では、スコープの概念が導入されてたはずで、forブロックで宣言した変数はforを抜けたら破棄されるはずなんですよね。

別にクリティカルな問題ではないですが、文法的に正しいのならコンパイラのバグってことなのかなぁ? VC++2005EEでは出てないので、コンパイラだけDLしてきて差し替えるって手もあるけど・・・、なんか不具合起きたら嫌だしなぁ。

けどこの手の書き方は結構あると思うので、ひょっとしたら問題が起きてるのかな? どういうキーワードでぐぐったらいいかちょっと分かりにくいけど、まぁなんぞ探してみるとしよう。

WindowsUpdateには更新パッチはなかったからなぁ。ほんと、なんか釈然としないわw

※2008/08/02 18:51 追記
Velnirとひでとさんからのコメントをもらったので、いっちょぐぐってみました。
結果、やはりVC6(VC7も)のコンパイラがC++の標準に準拠していなかったために起きたことのようです。
「/Zc:forScope」
でぐぐったらすぐ出てくると思います。コンパイラにこのオプションを引き渡すと標準C++の挙動通り、上のコードは通るようになります。ちなみにVC8(VC++2005)以降は標準C++に準拠した状態をデフォルトとしているため、上記のコードを書いてもエラーは発生しないとのことのようです>Velnir。 なので、VC++2005EEを使用してきた私はこのエラーに出くわしたことがなかったんですね^^;

つか、VCのコンパイラはあくまでVCのコードをコンパイルするためのもので、標準C++に準拠しているなんて考える方が間違いだったということを今更ながらに実感。そーいやテンプレートの扱いやらがおかしいというか準拠してないって話は出てましたなぁ。

まぁこれはバグというより仕様みたいですけれど、C/C++の勉強にVC++は勧めちゃいけないのかなとか思ってしまった今日この頃でありましたw

関連記事
スポンサーサイト
コメント
この記事へのコメント
同じルーチン内だと一回で良かった筈…。
C++はあんまり詳しくはないが、VC++2005でも同じようなエラーは吐かれた事あったように思う。
ま、今C言語触ってない人の言葉だから微妙だが。
2008/08/02(Sat) 16:29 | URL  | velnir #YG9ONXHE[ 編集]
この書き方の解釈はコンパイラによって違ったんじゃなかったかな。
2008/08/02(Sat) 17:15 | URL  | ひでと #vNL4O1UA[ 編集]
ぐぐってみた
結果はBlog記事に追記しておきましたので、また見てみてください~>ご両人
2008/08/02(Sat) 18:59 | URL  | こで #-[ 編集]
僕もVC6.0でこの問題に悩まされてました。コンパイラの仕様だったのね。
なんか中括弧のスコープの概念を悩ましくさせるエラーだったのでずーっと不可解でした。ネタ分かってすっきり。
ま、ひとつ上のスコープで冒頭にループ用変数の宣言をしてしまうクセがついてますがw
2008/08/03(Sun) 08:16 | URL  | しー #cBGzM2ew[ 編集]
私もしーさんに賛成ですな。
カウンタを何回も使いまわすところなら最初に宣言すれば良いような気がします(セキュアかどうかは別として
ま、一回しか使わない/使えないカウンタならスコープ内でやるのが普通だけど。
C使いから見るC++ってこんな程度…。
2008/08/03(Sun) 09:54 | URL  | velnir #YG9ONXHE[ 編集]
プログラムネタは意外に喰い付くのか?w
しーさんもこの問題に出くわしておられましたか。しーさんやVelnirが仰る通り、上で宣言したら済むことなのではありますが、やっぱ原因が分からないとすっきりしないですよねぇ(笑)

私はM$嫌いなので、これで余計に嫌いになりました(ぉ>しーさん

ん~、もちろん上で宣言してもいいんだけど、Velnirが書いてるように、私それぞれを使い分けてたのよ。forブロックを抜けた後にループカウンタを使うか使わないかで。

で、それがエラーになると地味に腹立つなと。文法的にまずいならともかく、正しいのに仕様で蹴られるのは嬉しくないべw

とはいえGCCにもそんな仕様いくつかあったりするから、そりゃもうどうしようもないんだけれどね^^;
2008/08/03(Sun) 10:26 | URL  | こで #-[ 編集]
コメントを投稿
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可
 
トラックバック
この記事のトラックバックURL
この記事へのトラックバック
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。