このブログは、旧・はてなダイアリー「檜山正幸のキマイラ飼育記 メモ編」(http://d.hatena.ne.jp/m-hiyama-memo/)のデータを移行・保存したものであり、今後(2019年1月以降)更新の予定はありません。

今後の更新は、新しいブログ http://m-hiyama-memo.hatenablog.com/ で行います。

その他プログラミング

爺感:なんだか作法がわからん

int foo(const int x) { // ... } のconstってなんだ? int foo(const int x) { x++; return x; } だと、エラーになる。 int foo(const int x) { int y = x; y++; return y; } とすればいい。だけど、何がうれしい? 何の意思表示だ?? 別にconstいらんじゃ…

爺感:ドカンと代入したり戻したり

ジイサマ(=自分)の感覚だと、Cの代入演算子 = でセットできるのは単純な型だ、という先入観がある。s = "abc"; はstrcpy()やstrdup()とは違う。if (s == t) のように文字列を比較してもしょうがない、strcmp() 使え、ってことになる。ところが、最近だと…

ジジイの感想・感覚、略して爺感

C/C++を20年ぶりくらいに使った。忘れているのか、もともと知らなかったのか(実際は両方)、戸惑う事やハマることもあった。それらは、だいたいメモしている。ここ20年でだいぶ様変わりしてるから、浦島太郎な感じもする。そこらへんをタイトルに「爺感」と…

非推奨であることを示す

http://stackoverflow.com/questions/12839517/detecting-deprecated-functions-in-c によると: Doxygenの@deprecatedディレクティブで、非推奨を指示できる。 GCCで __attribute__((__deprecated__)) で非推奨を指示できる。 MSVCで __declspec(deprecated…

ハンガリアン記法、結局

ハンガリアン記法についてグダグダ考えた: 「ハンガリアン記法」検索 結局、使わないことにした。既存コードと関係するところでは使うが、新規では原則使わない。だけど、変数に接頭辞は使う。 ポインター変数にはp, 参照変数にはrを付ける。 これは、意味…

C++のテンプレート、どうすべ

僕は、幸か不幸か、強い制約があるプロジェクトってあんまりやったことない(幸だな)。昔、「再帰は禁止」という規則に出会ったことはある。理由は分かりにくくなってメンテナンスに支障がある、だった。ナニイッテンダ、と思った。スタックが少ないとかの…

名前空間エクスプローラー

どんなプログラミング言語でも広義の名前空間の概念はあるわけで、名前が所属する場所と可視性の構造を持つ。名前の静的スコーピング構造と言ってもいい。パッケージ、モジュール、クラスなんかが広義の名前空間(スコープ)を定義する。C++ならずばり「名前…

Windows.hのmin/max さらに

min/max対策 - 檜山正幸のキマイラ飼育記 メモ編の続き。次のような定義があった。 #ifndef min # define min(x, y) ((x) < (y) ? (x) : (y)) #endif // min #ifndef max # define max(x, y) ((x) < (y) ? (y) : (x)) #endif // max これは: もともと、Wind…

ルールの依存項目に注意

次のようなパターンルールを書いていた。 %.o : %.cpp %.h stdafx.h.gch @echo Making object file $(CXX) $(CXXFlags) -c $< これは、*.cppと*.hが揃ってないと発火しない。*.hがない*.cppだと、デフォルトルールが適用される。そうすると、コンパイラの名…

C++の名前空間 3

C++の名前空間 2 - 檜山正幸のキマイラ飼育記 メモ編の続き次の2つの用途に限定しよう。 名前付きの構成素を大分類する。 インスタンスを必要としないクラスのように使う。 大分類はトップレベルの名前付き名前空間。名前空間の名前は、英小文字のみ短い名前…

たくさんの文字列定数

#define FOO "This is foo" #define BAR "I am Bar" // 以下同様 // ... のようなヘッダファイルをインクルードして使うと、マクロ定数はグローバルな名前でスコープも型も持ってないからよろしくない。確かに、そのとおり。次のように変更する。 // hoge.h …

ハンガリアン記法 2

ハンガリアン記法 - 檜山正幸のキマイラ飼育記 メモ編の続き。基本的には、ハンガリアンにあまり意味はないと思うが、ポインタ変数の先頭には接頭辞p、はやろうかな。fooがクラスオブジェクトを入れた変数だとして、ポインタなら foo->something, その場にあ…

C++の名前空間 2

C++の名前空間 - 檜山正幸のキマイラ飼育記 メモ編の続き。 using namespace foo; は使わない。std:: であっても。 その代わり、using foo::something; で個別・明示的な略記を許してもよい。 または、foo::修飾子を名前に付ける。 要するに、無修飾の名前が…

コメントの書き方

Doxygenで文書を作れるようにしようと思っているが、コメントが文書になるので色々と悩む。文体としてどれがいいか。 ナントカの値 (動詞を含まない) ナントカの値を取得 (意味は動詞だが、名詞で終わる、体言止め) ナントカの値を取得する ナントカの値…

C++の名前空間

C++に限らず、僕は「名前空間」的なスコープ概念が好きなんで、C++でも使ってしまっている。が、これは、名前のスコープが分かりにくくなる、面倒くさくなる、などの理由で他人からは歓迎されないかも知れないなー。ウーン、、、、既にあるレガシーコードは…

括弧なしのif文

if (x < 0) netative = true; のような、括弧(ブレイス)なしで一文だけ書くことがあるが、インデントがズレたりすると、かなり危ない。僕は嫌いだ。が、このテのif文がたくさんあったので、 egrep -n 'if \(.*\)[^{]*$' *.cpp > unsafe-if.grep で探して直…

ハンガリアン記法

ハンガリアン記法が嫌いだという話はたくさんあるが、擁護論は少ない。 http://stlalv.la.coocan.jp/HungarianNotation.html あんまり説得力があるとは言えないが、賛否を比べたいので。

秘伝のタレ、妥協的対策、邪悪なワザ

既存ソースの修正で感じたこと - 檜山正幸のキマイラ飼育記 メモ編 : もとのソースはよくテストされて枯れたソースなので、無闇に変更はしたくない。イジらなくてよいところはそのまま使いたい。構造を変えるようなリファクタリングもリスキーだからしたく…

Doxygenの連携図

Doxygenの連携図(doxygen collaboration diagram)は、クラスの継承階層だけでなくて、メンバ変数(フィールド、プロパティ)を経由しての参照関係も描画してくれる。クラス階層は、それ専用の依存/被依存関係図があるので、参照(利用)関係の表示が連携…

既存ソースの修正で感じたこと

既存ソースの修正というのはあまりやったことがなかったが、今ちょっとボチボチとやっている。次の制約・制限がある。 新しいコンパイラを使えない。 ソースコードのエンコーディングを変えられない。 コーディングスタイルを(あまり)変えられない。 C++だ…

min/max対策

windows.hのmin/maxは困る - 檜山正幸のキマイラ飼育記 メモ編の続き。意外とアッチコッチで引っかかるので、#undef min 、 #undef max で消している。一方で、Windows.hにmin/maxマクロがあるのを想定してそれを使っている所もあった。min/maxという名前が…

windows.hのmin/maxは困る

string streamを使うために、 #include <sstream> // std::ostringstream とする。これで文字列の構築を出力ストリームへの書き出しとして扱えて便利。ところが、なんかエラーする。エラーの箇所は次のようなコードのなか。c:/Installed/MinGW/lib/gcc/mingw32/4.6.2/</sstream>…

古めのC++コンパイラだと

とある処理部分をgithubにあるソースを使おうと思ったのだけど、古めのコンパイラだとダメな所があった。古めのコンパイラだと、 final, noexcept, overrideなどのキーワードを知らない。 右辺値参照 && を知らない。 右辺値参照に関わる std:move などを知…

タグジャンプ

gtagsに関しては→GNU Global - 檜山正幸のキマイラ飼育記 メモ編タグファイルを作ったり更新したりは、helm-gtags-create-tags, helm-gtags-update-tags。キーバインドは次のように覚える。 入力されたタグの定義元へジャンプ(kbd "C-c C-t") 'helm-gtags-fi…

続・関数オブジェクト

関数オブジェクト - 檜山正幸のキマイラ飼育記 メモ編 もうひとつ、関数オブジェクトってのがある。operator() を持つオブジェクト。 例を出す。まー、クロージャですね。 #include <stdio.h> struct CountedHello { int counter; CountedHello() : counter(0){} void</stdio.h>…

C/C++ の、空白で区切っただけで文字列連結

そう言えば、いつの頃からか、↓なことが出来るようになったのだよな。 #include <stdio.h> int main() { printf("hello, " "world\n"); return 0; } これ、マクロ定義と組み合わせられる。 #include <stdio.h> #define HELLO "hello" int main() { printf(HELLO ", " "world\n"</stdio.h></stdio.h>…

error: extra qualification

error: extra qualification ってなんだ、と思ったらヘッダーでメンバー関数をクラス名で就職してた。コピペするとよくこうなる。 - tuedaの日記 同じことをしていた。cppからヘッダにコピーしたら、、、

続々・定義済みのプリプロセッサ定数による判断

http://d.hatena.ne.jp/m-hiyama-memo/20160206/1454751537:tileの続き。次のようにした。やっぱりset_flagsの中身はコピペの連続。__GNUC__は、!_MSC_VER に吸収されるからドウデモいい定数。[追記] 「__GNUC__は、!_MSC_VER に吸収される」ってあたりはけ…

続・定義済みのプリプロセッサ定数による判断

C/C++ 定義済みのプリプロセッサ定数による判断、推論方法 - 檜山正幸のキマイラ飼育記 メモ編 の続き。次のような定義を共通ヘッダファイルに入れて、それをどのソースでもインクルードするようにする。 #if !defined(_WIN32) || defined(_POSIX_SOURCE) ||…

C/C++ 定義済みのプリプロセッサ定数による判断、推論方法

ユーザーの明示的な定義に依らないで、出来るだけコンパイラがセットするプリプロセッサ定数(マクロ定数)を使いたい。判断したいことは、 コンパイラが何か? 32ビットか64ビットか? MFCが使えるか? Win32 APIが使えるか? Windowsプラットフォームか? …