ページ 11

関数の外にあるブロック文の扱い?について

Posted: 2021年9月11日(土) 13:17
by nashinium
C++初学者です。入門書に記載されていたコードでmain関数の外に try文とcatch文を書いていてどう解釈したらいいか困っています。

コード:

int main()
try{
    	runtime_error("hogehoge ...");
} catch (exception& e){
	std::cerr<<"エラー: "<e.what()<<'\n';
} 
これがコードの全体なのですが、今まで入門書で見たコードではすべてのブロック文は何かしらの関数の中に書かれていたのでこの記述の仕方を始めてみたときは「ブロック文は関数内に書かないといけないはずでは?」とひどく困惑しました。

暇なときにこれについて考えて最終的に至った自分の中の結論が
このブロック文は関数外で変数定義する文と同じ使い方をしているんだ。となったのですが自分でも自信がありません。

コード:

constexpr int hogehoge{10};  // この部分です
int main()
{
    std::cout<<"hogehoge="<<hogehoge;
    return 0;
}  
初学者にもわかるように解説をしていただけると助かります、お願いします。

Re: 関数の外にあるブロック文の扱い?について

Posted: 2021年9月11日(土) 19:30
by box
これがコードの全体
ホントに?
main関数の閉じカッコがないんですが...。

Re: 関数の外にあるブロック文の扱い?について

Posted: 2021年9月11日(土) 20:11
by nashinium
解決しました。
プログラミング言語C++という本に記載されていました。どうやら関数tryブロックというものらしいです。(p380)

あと上の投稿に不備がありました。 関数tryブロック内の runtime_errorの前に throwをつけ忘れていました。申し訳ありません。

一応コンパイルと実行した際の画像を載せておきます。画像

Re: 関数の外にあるブロック文の扱い?について

Posted: 2021年9月11日(土) 20:55
by あたっしゅ
https://www.onlinegdb.com/ C++17

コード:

/******************************************************************************

Welcome to GDB Online.
GDB online is an online compiler and debugger tool for C, C++, Python, Java, PHP, Ruby, Perl,
C#, VB, Swift, Pascal, Fortran, Haskell, Objective-C, Assembly, HTML, CSS, JS, SQLite, Prolog.
Code, Compile, Run and Debug online from anywhere in world.

*******************************************************************************/
#include <iostream>
#include <stdexcept>
#include <cstdlib>


int
main()
try{
    throw std::runtime_error("hogehoge ...");
} catch (std::exception& e){
	std::cerr << "エラー: " << e.what() << std::endl;
} 
東上☆海美☆「
確かに、とおるっちゃみみ。

コード:

#include <iostream>
#include <stdexcept>
#include <cstdlib>


int
main()
try {
} catch(...) {
}
でとおるから、

コード:

int
main()
{
}
の { の前に try が入って、catch が付いた、
と考えればいいのではみみ ?

Re: 関数の外にあるブロック文の扱い?について

Posted: 2021年9月11日(土) 21:02
by あたっしゅ

コード:

void
func()
try {
} catch(...) {
}


int
main() {
    func();
}


// end.
東上☆海美☆「
これも、とおるみみ。

Re: 関数の外にあるブロック文の扱い?について

Posted: 2021年9月13日(月) 21:42
by 参照魚
自身はそこそこC++を知っているつもりでしたが、この書き方でコンパイルが通ることに驚きました。配列a[10] が10[a] と互換であるのを知った時以上の衝撃です。配列の方はまだ解説を見てなるほどと思いましたが、これの関数の{}が省略(?)できる理由がまったくわかりません。わたしもこれが文法的に正である理由を知りたいです。

Re: 関数の外にあるブロック文の扱い?について

Posted: 2021年9月13日(月) 22:20
by 参照魚
関数tryブロックというのですね...すでにかかれていましたね。
https://www.ibm.com/docs/ja/xl-c-and-cp ... dlers.html

コンストラクタでも使えるようです。
https://docs.oracle.com/cd/E19957-01/80 ... index.html
経験したことのないすごく奇妙な感覚です。