日記

内容の正しさは保証しません

wxWidgetsをビルドしたい

まだ出来てない。
コンパイラはmsys2から入れたclang5.0.1
wxWidgetsはstableと書いてある3.0.4

詰まったのは次の箇所:

    case 0xfffffd9f: // readystatechange in IActiveMovie2 and IMediaPlayer
./src/msw/mediactrl_am.cpp:2234:10: error: case value evaluates to 4294966687, which cannot be narrowed to type 'DISPID' (aka 'long') [-Wc++11-narrowing]
    case 0xfffffd9f: // readystatechange in IActiveMovie2 and IMediaPlayer

clang++では、-std=c++11(以降)でコンパイルするとcaseに0x80000000以上を書いたときエラーになる。

int main()
{
	long a; //longは4バイト

	switch (a) {
	case 0xffffffff:
		break;
	}
	a = 0xffffffff;
	return 0;
}

でも代入はエラーにならない。
しかもg++ ではどれもコンパイルが通る。なぜだ
対処法はあるのだろうか(募集中)

clang-clを導入しようとした

QtとclangをWindowsで使いたくて、英語のよくわからないサイトを頑張って解読していたらclang-clを使えばできるらしいと知った。
失敗までの手順
1、VS2017をインストール
2、LLVMをインストール
3、MSBuildが見つかりません
4、3およびGoogle検索を繰り返す

2時間くらい検索したがさっぱり分からない。もしかしたらVS2015でなければならないかもしれないと気づいたところで力尽きた。

clangに拘るのは日本語の識別子に対応しているため。それからコンパイルエラーのメッセージがMinGWより若干親切な気がする。英語なのに。
そういうわけでQtはひとまず諦める。

そういえばコード貼れるようになったのに試してなかった。全然コード書いてないので今度やる。

ノート 18/5/7

1.std::stringで文字列を検索して全部置換する方法

C++ 文字列の置換/全置換【replace/replace_first/replace_all|std::string】 | MaryCore

std::string s = "a, b, c"; // 置換対象の文字列

std::string target = ", "; // 検索文字列

std::string replacement = "-"; // 置換文字列

if (!target.empty()) {

std::string::size_type pos = 0;

while *1 != std::string::npos)

{

s.replace(pos, target.length(), replacement);

pos += replacement.length();

}

}

 

2.templateの特殊化は外で行う

//T.hpp

struct T

{

    template <class X> X f();

 

//コンパイル エラー

//  template <> int f() { return 1; }

};

 //こちらが正しい

template <> int f() { return 1; }

 

3. 関数の後ろに アロー(->) がついてる書き方

戻り値を指定する書き方の1つ

template <class T> auto f() -> T { }

 

4. テンプレート・テンプレート

std::vector<T>とTを受け取りたい時の書き方

template <template <class> class S, class T> f();

 

f<std::vector<int>>();

//ちょっと自信ないので後で検証する

 

5. jsonのパース

picojsonとjson11を使ってみた.

picojsonは数値=doubleなので、キャストが面倒くさい

それからjsonを生成する処理が冗長

using o = picojson::object;

using v = picojson::value;

 

int id = 12345;

o j;

j.insert({"id", v(static_cast<double>(id))});

既に括弧地獄で意味不明.

 

もう1つ.配列が面倒くさい

parseの際に1つ1つ取り出すのは仕方ないが、json生成のときに1つ1つvalueに変換してarrayに格納しなければならずいらいらする.

 

json11

上記のうるさいコードを書かずに済むみたい.

 

//test.json

{

    "data": [

        {

            "id": 123,

            "name": "aiu";

        },

        {

        //省略

        }

    ]

}

 

//std::string srcはjsonファイルの中身

std::string err;

json11::Json json = json11::Json::parse(src, err);

for (auto& e : json["data"].array_items) {

    std::cout << e["id"].int_value() << std::endl;

}

このように取り出す

 

json生成

using object = json11::Json::object;

using array = json11::Json::array;

json11::Json json = object {

    {"data",

        array {

            object {

                {"id", 123},

                {"name", "asdf"}

             },

             object {

                //略

              }

        }

    }

};

 

6.std::stringと数値の変換

std::string s = std::to_string(12345);

 

#include <sstream>

#include <type_traits>

V v;

std::stringstream s;

std::string src;

if (std::is_integral<V>() || std::is_floating_point<V>()) {

    s << src;

    s >> v;

}

 

//コードの貼り方が分からない

//気が向いたら調べます

できたっぽいです.次の記事から反映されます

*1:pos = s.find(target, pos