2013年11月25日月曜日

[Visual Studio] コードフォーマッタのスタイルを自分好みに変更する

Visual Studio Express 2013 for Windows Desktop を使ってみたのですが、
if と ( の間にスペースを自動挿入する設定になっていました。

if と ( はくっつけたい派なので、設定を変更してみました。

設定方法
  1. 「ツール」メニュー - 「オプション」を選択します。
  2. オプションダイアログから「テキストエディター」 - 「C/C++」 - 「書式設定」 - 「行間」を選択
  3. 「コントロールブロックのスペース」の「制御フローステートメント内のキーワードと始めかっこの間にスペースを挿入する」のチェックボックスからチェックを外す

これで if と ( の間にスペースが入らなくなります。

これ以外にも、細かく設定できるので自分好みのスタイルに変更してみてください。

2013年11月21日木曜日

VC++ Compiler November 2013 CTP の noexcept でバグ

Visual C++ Compiler November 2013 CTP で noexcept が使えるようになったので、早速 iutest で noexcept を有効にしてビルドしたのですが、エラーになってしまいました。

再現コードはこちら。
template<typename F>
void f(F func)
{
    func();
}

void g() noexcept
{
}
void h()
{
}

int main() {
    f(g); // OK
    f(h); // error C2664
    return 0;
}

こちらを VC++ でビルドすると下記のエラーが発生します。
error C2664: 'void f<void(__cdecl *)(void) noexcept>(F)' : cannot convert argument 1 from 'void (__cdecl *)(void)' to 'void (__cdecl *)(void) noexcept'

f(g); をコメントアウトするとビルドが通ります。
f<void (*)()>(h); と書き換えてもエラーになります。
また、以下のように g と h を入れ替えてもビルドが通ります。
int main() {
    f(h); // OK
    f(g); // OK
    return 0;
}

どうやら、先に noexcept 付きで実体化されると noexcept でないものまで noexcept を要求されるようです。

gcc では当然通る。
[Wandbox]三へ( へ՞ਊ ՞)へ ハッハッ

とりあえず、バグ報告しておいた。

2013年11月20日水曜日

constexpr 勉強します

Visual C++ Compiler November 2013 CTP が公開され、constexpr が使えるようになったので、
早速自作テスティングフレームワークの iutest で試してみました。
iutest には以前から constexpr 対応を入れてきましたが、動作検証を全くしてませんでした。

見事に失敗
VC++ 2013 CTP の _MSC_FULL_VER は 180021114 なので、その場合は IUTEST_HAS_CONSTEXPR=1 とすることで、constexpr なコードになります。(なるはずだった…)

で、ビルドしたのですが内部エラーやら constexpr として評価できないよ~と言われてしまいました。。。
ひとまず、対象の関数は constexpr 外して一応ビルドは通るようになったのですが…
ご覧の有様。



warning C4592: 'iutest::detail::ToHex': 'constexpr' call evaluation failed; function will be called at run-time
コンパイルタイムになってないよ警告が出まくり…
constexpr を身に付けるため一から出直したいと思います。