try catch の範囲について – プログラミング – Home

通知
すべてクリア

[解決済] try catch の範囲について


may
 may
(@may)
ゲスト
結合: 20年前
投稿: 26
Topic starter  

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
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

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
 may
(@may)
ゲスト
結合: 20年前
投稿: 26
Topic starter  

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

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


返信引用
may
 may
(@may)
ゲスト
結合: 20年前
投稿: 26
Topic starter  

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

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


返信引用
may
 may
(@may)
ゲスト
結合: 20年前
投稿: 26
Topic starter  

度々すみません。
書き誤ってしまいました。

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


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

> フリーのお勧めなコンパイラがあれば教えてください。

VC++ 2005 Express。

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

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


返信引用
may
 may
(@may)
ゲスト
結合: 20年前
投稿: 26
Topic starter  

>extern がついてると宣言で、ついてないと定義?

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


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

C++の場合、ISO/IEC14882:2003だと3.1 Declarations and Definitions。
「宣言だけ」を行うのは以下。

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

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


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

厳密なところは参考書なり言語規格書なりにあたってもらうとして
こう理解しておけばまあ間違いぢゃない。

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

んで、ほとんどの宣言は同時に定義でもある。
一部、定義にならない宣言もある(宣言にならない定義もある)
(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
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

ベタな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
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

ちなみにWideStudioのコンパイラはGCCです。
環境としてはMinGWなのでコマンドプロンプトでも実行可能です。


返信引用
may
 may
(@may)
ゲスト
結合: 20年前
投稿: 26
Topic starter  

レスが遅くなり、すみません。
皆さん、分かりやすい回答をありがとうございました。

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

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


返信引用
あ
 あ
(@あ)
ゲスト
結合: 23年前
投稿: 47
 

> # っていうかなぜ今時 vc++6 ?
そんな事は貴公の知った事ではない。
黙って質問に答えればよい。


返信引用
い
 い
(@い)
ゲスト
結合: 22年前
投稿: 3
 

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


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

馬鹿にしてるわけじゃないっしょ。

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました