metashellの紹介

これはAmusementCreators AdventCalendar通称ACACの7日目の記事です。

metashellとは

C++の対話型環境です。テンプレートの展開などを追えるのでC++のTMPを学ぶのに 良いです。

導入

対応している環境は

です。
これらに当てはまるならここからインストーラーを手に入れることが出来ます。
また、対応していなくてもgithubからソースコードをダウンロードしてinstall_build_dependencies.shbuild.shを実行すれば自前でビルドできます。

使い方

環境

#msh environment

で何がどう定義や宣言されていたり、どのファイルがインクルードされているかを知ることが出来ます。
これらの環境を一時的に保存するには

#msh environment push

してください。これによって現在の環境か変わることはありません。
その後、一段落してもとの環境に戻りたいときは

#msh environment pop

してください。pushする前の環境に戻ったと思います。
また、現在スタック上にいくつの環境があるのかは

#msh environment stack

で教えてくれます。
他にも

  • #msh environment reload ・・・インクルードファイルを読み直す
  • #msh environment reset・・・環境を初期状態に戻す(環境のスタックは変わりません)
  • #msh environment save <path>・・・環境をファイルに保存(metashell実行時に--enable-savingを引数に与える必要あり)

などが出来ます。

デバッグモード

#msh mdb <type>

デバッグモードに入ります。デバッグモードになると先頭に(mdb)が表示されます。
typeは省略できて、省略した時は直前の計算に対するデバッグモードになります。

デバッグモードでは

  • step n・・・でnつだけ処理を進める。
  • step over n or next n・・・現在のtemplateの階層よりも深い展開を無視してnつ分処理を進める。
  • step out・・・現在のtemplateの階層を抜ける
  • rbreak <regex>・・・正規表現にマッチした所にブレークポイントを張る
  • continue・・・ブレークポイントに引っかかるまで処理を進める
  • break list・・・ブレークポイントのリストを表示する
  • finish・・・ブレークポイントを無視して最後まで処理を進める
  • forwardtrace or ft・・・これからの処理を表示する
  • backtrace or bt・・・これまでの処理を表示する
  • help <command>・・・コマンドのヘルプを見る
  • quit・・・デバッグモードを終了する

などができます。

そのほか

  • boost::mplのコンテナを使うときはmetashell/formatter.hppをインクルードしておいた方が良さそうです
  • #msh quitでmetashellを終了します
  • #msh precompiled_headers onとするとプリコンパイル済みヘッダを使えます
  • いちいちうるさいなぁと感じたら#msh verbose offにするとよいです

C++におけるgoto文について

これはAmusementCreators AdventCalendar14日の記事です。

C++にはC言語と違ってclassがあるため結構複雑になってる。

goto文が変数の宣言を飛び越える時

危険だし全く推奨されないのだけどgoto文で変数宣言を飛び越えることができる。 つまり以下は合法。

    goto some_label;
    int value;
some_label :

しかしこのようにgoto文で飛び越えれる自動ストレージ*1上の変数には以下のいずれかを満たさなければならない。

  • スカラー型である
  • trivialでdefaultなコンストラクタとtrivialなデストラクタを持つ
  • これらの型がCV修飾された型
  • これらの型の配列型

さらに

  • 初期化子なしで宣言されなければならない

という制限もある。

例を示すと

    goto some_label;
    int x;              // いい
    int x = 0;          // 悪い(初期化子がある)
    Pod obj1;           // いい
    NonPod obj2;        // 悪い(trivialでない)
    static NonPod obj3; // 良い(そもそも自動ストレージに確保されない)
    static NonPod obj4{};  // 良い(初期化子があっても上と同じ理由で)
some_label :

goto文で処理が巻き戻るとき

このような時は宣言を跨がれた変数は破棄される。当然デストラクタも呼ばれる。

some_label :
    SomeClass object;
    goto some_label; // ここでobjectが破棄される

まとめ

そもそもイディオム化した書き方以外でgoto文を使うのはやめよう。

*1:ぶっちゃけスタック領域の事だが規格上はコンパイラはスタック領域として実装する必要はない

AmusementCreators AdventCalendarの開催をいまここに宣言する

これはAmusementCreators AdventCalendar2015の一日目の記事です。

AmusementCreatorsの秋津早苗です。
AdventCalendar初回ということで我らAmusementCreatorsの紹介と一年を振り返っての感想を綴っていこうと思います。

Amusement Creatorsとは

AmusementCreatorsとは筑波大学公認のゲーム制作サークルです。

どんなところか

サークルができた当初は、ゲーム制作サークルというよりは元から自分の同人サークルを持っている人たちが技術を共有する場所だったそうです。
僕が入部した時は硬派な技術者集団といった感じでした(C++erですって言うと先輩に好きなBoostライブラリを聞かれて戸惑いました)が、今年の新歓でリソースを作れる人を求めていた事もあって技術者成分は薄れてきたのかなという感じがします。

活動

毎年サークル内で48時間ゲームジャムや6週間ゲームジャムを行って、その成果物を毎年夏コミと冬コミで発表しています。
今年も3日目東モ40bで参加します。 ただ実は、ここ数年時間の都合で6週間ゲームジャムは開催できてません…
来年こそはしたいですね。

Altseed

AmusementCreatorsの部員やOBなどが集まってAltseedというゲームエンジンを作っています。
C#C++など複数の言語を使ってほとんど同じ書き方で開発でき、僕らのサークルでのプログラミングの教育に使われています。将来的にJavaもサポートされそうです。
良いライブラリなので皆さんも是非使ってみてください。
詳細は http://altseed.github.io/ にて

今年を振り返って

今年は代表が多忙だったということもあり、サークルとしての活動はそれほど多くなかったと感じます。
でも、今年は部員が増えて色々と幅が広がったのでこれからどうなるか楽しみです。

僕個人の話だと、今年は作っているときは面白いと思っていたゲームが完成した数か月後には面白く感じられなくなるという現象が何回も起こったので精進しなきゃなと思います。

最後に

このAdventCalendarは纏められて今年の冬コミC89で頒布される予定です。
もし紙媒体で読みたいという稀有な方がいれば是非AmusementCreatorsのスペースにお越しください。
改めて言いますと3日目東モ40bです。

次の記事はラン君でshadertoyの話です。