try catch の範囲について

[戻る]
may 2007/03/09(金) 15:59:04
C++でコーディングをしようとしています。
コンパイルはVC++6.0で行うつもりです。

try catchのtryの範囲は、変数宣言も含めた方が良いのでしょうか?
例えば、以下のような場合、ifstream fin;も例外が発生しますか?
(コードの誤りは見逃してください。まだ作成中なので。。。)

int main(int argc, char* argv[])
{
    ifstream  fin;
    char      buf[1024];

    fin.open(argv[1]);
    fin.getline(buf, sizeof(buf));
    printf("%s", buf);
    fin.close();

    return 0;
}

tetrapod 2007/03/09(金) 16:43:07
VC++6 は言語規格書確定以前の処理系なので
・new の挙動が標準と異なる
・メンバ初期化中の例外処理で必須な function-try に対応してない
try-catch/例外を正しく使いたいなら別なコンパイラに乗り換えることを強く推奨
# っていうかなぜ今時 vc++6 ?

> try catchのtryの範囲は、変数宣言も含めた方が良いのでしょうか?
変数宣言を含める必要は無い。
変数定義は try の中にある必要がある。
宣言と定義の違いを理解してる?まずはそこから。

ifstream fin; だけだと例外は発生しないっぽい (規格書あたってないけど)
任意のクラス T に対して T t; だと例外は発生しうる。
struct exception_thrower {
  exception_thrower() { throw 0; }
};

may 2007/03/09(金) 16:54:45
>try-catch/例外を正しく使いたいなら別なコンパイラに乗り換えることを強く推奨
># っていうかなぜ今時 vc++6 ?
  手元にあるからというだけです。
  まずは勉強段階のため、フリーのお勧めなコンパイラがあれば教えてください。

>宣言と定義の違いを理解してる?まずはそこから。
    分かっていませんでした。
  以下の2行は、どちらにあたるのでしょうか?
    ifstream  fin;
    char      buf[1024];

may 2007/03/09(金) 16:57:38
>ifstream fin; だけだと例外は発生しないっぽい (規格書あたってないけど)
>任意のクラス T に対して T t; だと例外は発生しうる。
>struct exception_thrower {
>  exception_thrower() { throw 0; }
>};

すみません。
以下のように書いてくれているということは、
以下の2行は変数定義ですね?
    ifstream  fin;
    char      buf[1024];

may 2007/03/09(金) 17:20:02
度々すみません。
書き誤ってしまいました。

誤:以下のように書いてくれているということは、
正:上のように書いてくれているということは、

シャノン 2007/03/09(金) 17:29:41
> フリーのお勧めなコンパイラがあれば教えてください。

VC++ 2005 Express。

> 宣言と定義の違いを理解してる?まずはそこから。

俺も理解してなさそうなので、ついでに教わろう。
extern がついてると宣言で、ついてないと定義?

may 2007/03/09(金) 17:41:42
>extern がついてると宣言で、ついてないと定義?

ということは、ローカル変数は全て変数定義ということですか?

Ban 2007/03/09(金) 18:54:00
C++の場合、ISO/IEC14882:2003だと3.1 Declarations and Definitions。
「宣言だけ」を行うのは以下。

関数宣言、extern宣言、リンケージの宣言、
クラスの静的データメンバ宣言、クラス名の前方宣言、typedef、
using-declarationまたはusing-directive

他は、定義するとそれは宣言でもある。

tetrapod 2007/03/09(金) 19:10:07
厳密なところは参考書なり言語規格書なりにあたってもらうとして
こう理解しておけばまあ間違いぢゃない。

宣言:「名前」を使えるようにすること
定義:「実体」を使えるようにすること

んで、ほとんどの宣言は同時に定義でもある。
一部、定義にならない宣言もある(宣言にならない定義もある)
(extern 宣言とか static member の定義とか)

例
{ int x; ... } だと ... 部で x という変数が名前だけでなく実体も使えるわけで
これは「変数宣言であり同時に変数定義」

{ extern int y; ... } だと ... 部で y という変数(の名前)が使える
けどどこかに y を実際に定義するものがなければリンク失敗、
つまり名前は使えるけど実体は使えないので
これは「変数宣言であるが変数定義にならない」

> ということは、ローカル変数は全て変数定義ということですか?
そのとおり。もっと正確に言うと「変数宣言であり同時に変数定義」

exception_thrower e; も「変数宣言であり同時に変数定義」
この e のコンストラクタ中で例外を投げてくるから try の中にあるべき。
extern exception_thrower e; だと、ここでコンストラクタが起動してないから
「これだけなら」例外を投げることはないよね = try の外でも ok

ifstream fin; も変数宣言であり同時に変数定義
定義なんだけど、このコンストラクタは例外送出しないと規格書にある
ifstream fin("filename.txt"); も変数宣言であり同時に変数定義
このコンストラクタは例外送出する可能性があると規格書にある

// クラス宣言とクラス定義を言い出すとまた話が厄介なので省略
// C には「仮定義」があるけど C++ にはないとかの話も省略

コンパイラだけど VC++2005EE はすでに出たから cygwin (GCC) を紹介しとく

PATIO 2007/03/12(月) 14:50:09
ベタなC++言語の勉強がしたいならGCCでも良いような気もします。
なにもMicrosoftのコンパイラにこだわる必要もありませんし。
実は探せば結構色々ありますよ、フリーのC++開発環境。

DevC++-JPとかありますし、
Java環境一式落とす事も厭わないならEclipseでCDTと言う手もあります。
もっとも、この辺はコンパイラと言うよりもIDEですけれどね。
目先が変わりますけれど、WideStudioと言うのもありますよ。
コンパイラ一式全てワンパッケージで手に入りますし。
インストールも簡単です。ウインドウ周りのライブラリは
WideStudio独自のクラスライブラリになっているのでMFCとは
使い勝手は異なりますが、一応ウインドウプログラムも組めます。
確か、コンソールプログラムも組めたはずです。
これだと、コマンドプロンプトでも実行できたはず。

VisualC++についての勉強がしたいと言う話ならちょっと事情は変わってきます。
MFCというMicrosoftが提供しているクラスライブラリの使い方まで含めて
勉強したいならちゃんとVS2005を購入しないと駄目ですね。
但し、スタンダードで学生さんライセンスでかなり安く手に入ると思います。
.NET Frameworkを使用したC++/CLIまで使えれば良いなら
VC++2005 Express EditionでもOKだと思います。

PATIO 2007/03/12(月) 14:52:11
ちなみにWideStudioのコンパイラはGCCです。
環境としてはMinGWなのでコマンドプロンプトでも実行可能です。

may 2007/03/13(火) 13:15:15
[[解決]]
レスが遅くなり、すみません。
皆さん、分かりやすい回答をありがとうございました。


コンパイラは「VC++2005 Express Edition」をダウンロードしました。
これから使ってみます。

ほんとうにありがとうございました。

2007/03/17(土) 21:06:33
> # っていうかなぜ今時 vc++6 ?
そんな事は貴公の知った事ではない。
黙って質問に答えればよい。

2007/03/18(日) 19:41:11
自分もVC++6.0使ってるし、案外まだ6使ってる人は多いと思う。
2005ExpでもSDK使えるらしいけど面倒だし、全体的に重いって欠点もあるし。
VC6を馬鹿にするのも馬鹿にされて過剰反応するのも良くないと思う。

επιστημη [HomePage] 2007/03/18(日) 22:02:35
馬鹿にしてるわけじゃないっしょ。

VC6のサポートはとっくに切れてます。
何らかのトラブルがあってMSに問い合わせても答えてくれないってことです。

そんなコンパイラを("今も使っている"はともかくも)
"今から使う"てのはどうよ? ってことです。

古いスレッドには追加発言できません。