C/C++

gcc と cl のスタックフレームの作り方・使い方の違い

3 ヶ月ぐらい、デスクトップの附箋メモに書きっぱなしで、調べいなくて、今後も調べないような気がするので、ここにメモを残して附箋は削除しよう。 #include <stdio.h> int foo(int& b) { printf("%p %d\n", &b, b); return b *= 2; } int& bar() { int a = 1; print</stdio.h>…

C/C++ FAQ #2 (構造体内の可変長配列)

構造体に可変長配列を定義したい場合があります。 struct foo { size_t size; char *array; }; こんな感じの構造体で、char 配列の長さは動的に決定される、というようなケースです。この場合以下のように使用します。 int main(int argc, char *argv[]) { s…

C/C++ FAQ #1 (引数に void を受け取る関数)

おいらも FAQ を書いてみる。 引数の void void example(void); void example(); これは、C++ ではどちらも引数なし、という意味だが、C では example() の方は関数の引数の情報が単に不明である、ということになる。要するに: void example() { printf("ok…

柴田望洋氏の C/C++ FAQ で再発見

2〜3 分のコンパイル待ち時間、みなさんどのようにお過ごしですか。僕は昨日はC言語FAQ / C++言語FAQ【BohYoh.com】を見て過ごしました。95% は知っている内容でしたが、知らないものもあったので、ここで紹介。 C++ char型、unsigned char型、signed char型…

std::vector の使い方

今まで vector はこんな感じに使っていた。 std::vector<std::string> list; list.push_back(std::string("hoge")); list.push_back(std::string("fuga")); これはこれでよいのかもしれないけど、push_back した時点でコピーコンストラクタが呼び出されるので、無駄にふた</std::string>…

C の宣言あれこれと printf

昨日のエントリをちょっと検証しようかなと思って、以下のようなコードを書いた。 #include <stdio.h> int main(int argc, char *argv[]) { unsigned i(2); printf("%d %d %d", unsigned long long int(1), i, long(3)); return 0; } さあ問題。どのような出力が得ら</stdio.h>…

C++ の深遠

C++ は以下のように変数宣言ができる。 std::string s("hoge"); 初めて見たときは「なんじゃこりゃ」と思ったものですが、慣れとは怖いもので、今ではまったく違和感がないどころか、むしろ好んで使っている。で、これの int 版は int i(100); と書くことが…

std::remove() #2

std::remove() で algorithm ヘッダの std::remove() が便利、と書いたんだけど、落とし穴があった。std::remove() は要素を削除するというよりは、要素を削除してそれ以降をシフトする、という感じ。 std::vector<int> v; v.push_back(0); v.push_back(1); v.pus</int>…

半透明ウィンドウ、部分的に不透明 #2

前回の半透明ウィンドウ、部分的に不透明の下記が解決した。 一点わからない点があります。指定色透明を SetLayeredWindowAttributes で行うわけですが、今回のように任意の画像を表示させる場合、その画像に透明色に指定した色が含まれていた場合、以下のよ…

std::remove()

哎呀!std::vector の要素削除は不便だなー、と思っていたけど、こんな便利な機能があったなんて。 今までのコード #include <vector> std::vector<Foo *>::iterator iter = v.begin(); Foo *foo; for (int i = 0; i < n; i++) { iter++; } foo = *iter; v.erase(iter); del</foo></vector>…

半透明ウィンドウ、部分的に不透明

半透明だけど部分的に不透明にしたい、という場合、ウィンドウをふたつ作成して、常に連動するように制御する必要がある、ということがわかりました。 ポイントは、半透明のウィンドウと指定色透明のウィンドウをふたつ作成し、常に連動して動くようにするこ…

Windows C/C++ は型がやたらめったら多すぎ!

/* * WM_WINDOWPOSCHANGING/CHANGED struct pointed to by lParam */ typedef struct tagWINDOWPOS { HWND hwnd; HWND hwndInsertAfter; int x; int y; int cx; int cy; UINT flags; } WINDOWPOS, *LPWINDOWPOS, *PWINDOWPOS; winuser.h からの抜粋。なんで…

#define VOID void

VC++ を触り始めて 8 年ぐらい。いまだにわからないのは、何故 #define VOID void という定義があるのか。僕の推測。 Microsoft はすべて大文字の型定義が好き INT とか SHORT とか また、ポインタ型の定義も好き PINT とか PBOOL とか それで void* を PVOI…

MultiByteToWideChar の第一引数に何を指定してよいものやら

MultiByteToWideChar 関数によると、第一引数にはコードページを渡すことになっているんだけど、説明があっさりしすぎてどれを指定してよいのかさっぱりわからない。 CP_ACP: ANSI コードページ CP_OEMCP: OEM コードページ CP_THREAD_ACP: 現在のスレッドの…

VC の開発環境で悩む

VC は 2003 から使い始めて、もう 5 年になるわけですか。別に IDE が使いたいわけではないんだけど、もはや手放せないのがステップ実行が可能で、変数の内容が変更でき、デバッグ中でもコードの変更が可能なデバッグ環境。Haskell で何かを作ってみようかな…