2016年7月7日木曜日

[vs2015] Nameless union and struct problem.

vs2015 で設定はデフォルト。

#include <iostream>

class Foo final
{
public:
    Foo() = default;
    ~Foo() = default;

private:
    int value;
    struct
    {
        int x;
        int y;
    };
    union
    {
        int a;
        float b;
    };
    union
    {
        int v[2];
        struct
        {
            int z;
            int w;
        };
    };
};

void main()
{
    Foo foo;
    //foo.value;  // NG.
    //foo.x = 10; // NG
    //foo.a = 10; // NG

    // foo.v[0] = 10;  // NG
    // foo.v[1] = 10;  // NG

    foo.z = 10; // !?
    foo.w = 11; // !?
    std::cout << foo.z << std::endl;    // !?
    std::cout << foo.w << std::endl;    // !?
}

Error(Active)



特に問題はなし。
※ 9行目の private を public にすれば表示はされない。


Error message




エラーメッセージが出力されない。
ビルドに成功し実行ファイルが生成される。

Console out




!?

この状態で他のエラー要因(なんでもよい)を挿入すれば、
それに誘発されて本件もエラーメッセージに出力はされる。
が、他のエラー要因がなくなると元通り(Debug / Release 関係なし)。


※ 追記
Intellisenseには表示されないので見落としてしまう上、
private としているので直感もあてにならない・・・。

3年程前の Stack Overflow に同問題があるのを見つけた。

Stack Overflow: C++ private modifier ignored on nested anonymous struct

放置かい!

2016年6月24日金曜日

Custom assert macro

少し前からホビープログラムをC++主体に戻した。
1x系は刺激的で楽しい。

そんな刺激的な中で何も変わっていないものが普通の assert。
コンパイルタイムで利用できる static_assert が追加され、メッセージも別途出力できるのに
こいつだけは何も変わっていない!

assert(false && "hoge");
assert(!"foo");

泥臭くていやなんです。
ということで、何番煎じかは置いといて「無ければ作ればよろし」。

前提としては、
(1) メモリがシビアではない環境
(2) メッセージの別途出力(stream風に記述したい)
(3) リリースモードで一命令も吐かせない
(4) リリースモードでコンパイラを黙らせる(C4101対策)

bool cond = false;
int value = 10;
assert(cond, "hoge: " << value);

上記のような感じが目標。

#pragma once
#include <iostream>
#include <sstream>

#undef ASSERT_MSG
#undef ASSERT

#ifdef NDEBUG
 #define ASSERT_MSG(expression, message)\
    do{\
        (void)(true ? (void)0 : ((void)(expression)));\
        (void)(true ? (void)0 : ((void)(std::ostringstream() << message)));\
    }while(false)
 #define ASSERT(expression)\
    ASSERT_MSG(expression, "")
#else
 #define ASSERT_MSG(expression, message)\
    do{\
        if(!(expression)){\
            std::cerr << "Assertion `" #expression "` failed in " << __func__ << "() " << __FILE__ << "(" << __LINE__ << "): " << message << std::endl;\
            std::terminate();\
        }\
    }while(false)
 #define ASSERT(expression)\
    ASSERT_MSG(expression, "")
#endif

そしてこんな感じ。

bool cond = false;
int value = 10;
ASSERT_MSG(cond, "hoge" << value);

STL(std::ostringstream())はコンパイルタイムで対処しないとコードが生成されるため
当初は、(void)sizeof() などを利用したが、その他のケースを両立できないため
シンプルにコンパイラに丸投げすることに。

msvs2015環境では前提条件をすべて満たしたことは確認。
コンパイラさんの最適化恐るべし。

2014年6月10日火曜日

Xperia Z2 Tablet

衝動買い。

コストパフォーマンスは現時点で最高と思うし満足なのだが難点が1つ。




海外モデルの頃から情報が錯綜していたため判断が付かず

ダメ元で購入しておいたらダメだったというお話。

ならばと、代替案などないものかというところではあるが

そりゃまぁ他社製品宣伝するわけにはいかんわな。

今時のタブレットでスタイラス抜きというのも考え難いし

開発中には市販品使ってテストをしていると思うんだが

これといって情報は無さげ。

安ければ色々試してみるのもありなんだけど、スタイラスってぼったくりが

多すぎるんだよなぁ。

追記:6/11

安かったのとタブはワコムだろうということで悪あがきをしてみた。
Bamboo Stylus の一番安いので試したところ反応あり。
その他、手持ちのNW-88xPaperwhiteも反応があり嬉しい誤算。