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;
{"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