C++

C++テンプレートのメモ

C++

struct reporter { reporter() { cout << "construct" << endl; } ~reporter() { cout << "destruct" << endl; } reporter(const reporter &) { cout << "copy" << endl; } reporter(reporter &&) { cout << "move" << endl; } reporter &operator =(const r…

staticの意味

C++

C++において、staticは複数の意味を持ちます。 関数内に書けば静的変数。 グローバルに書けば内部リンケージ変数、関数。 メンバ変数に書けば静的メンバ変数(ただし別途実体定義が必要)。 さらにinline指定と組み合わせることができ、 グローバルにinline st…

変数定義が関数宣言と間違われる

C++

C、C++はローカルに関数を宣言できます。1 例えば以下のように stdio.h をインクルードしなくとも、コンパイラは警告も何も発しません。 int main() { int puts(const char *); puts("Hello World!"); } ローカルに宣言された関数識別子の有効範囲はそのスコ…

C/C++用のMakefile

こちらを参照しながらバッと書いたもの。 設定エリアの変数値を変更してバイナリファイル名やソースディレクトリ、コンパイラやそれに渡されるオプションを設定する事が出来ます。 coption はコンパイルオプションの、 loption はリンクオプションの略。 # =…

C++ 区分化

C++

範囲を引数にとる関数はしばしばその範囲が「区分化」されていることを要求します。 区分化されているとは、おおざっぱに言えばある条件により分けられた2つの範囲が昇順に並べられている事を指します。 昇順にソートされた数列 [ 0, 2, 4, 6, 8 ] は、任意…

C/C++ 厳密な別名付け

C C++

この記事を読んでメモ。 明らかにおかしな参照やポインタのキャストによるアクセスはコンパイラの最適化によって無視される可能性があるよって話。 uint32_t f(uint32_t a) { uint16_t *p = &a; // uint16_t は uint32_t の別名とはなり得ない // p は a を…

構造体/クラスの多重定義エラーは1つの翻訳単位内で起こる

C C++

C/C++ の入門サイトや入門本でインクルードガードの説明に「構造体/クラスの多重定義を避けるため」とあるが、 main.c と sub.c でインクルードされたらどうしようもなくね?という疑問が残るだろう。 多重定義エラーはコンパイル時に起こるものなので、例え…

g++でfilesystem使おうとしたらそんなものはないと言われた

C++

以下のコードのコンパイルが通らなかった(プリプロセスでつまずいた)話。 #include <iostream> #include <filesystem> using namespace std; using namespace std::filesystem; int main() { cout << current_path() << endl; } $ g++ -std=c++17 ./main.cpp -lstdc++fs ./main.cpp</filesystem></iostream>…

多重ポインタとconst

C C++

C/C++でのポインタ変数はアスタリスクとconstの位置関係によって「何が」constかが変わってきます。 例えばint型ポインタ変数の書き方は以下の様に4種類存在します。 - - - - *p = value p = pointer int * o o int const * x o int * const o x int const *…

C++ストリーム系の雑なメモ

C++

文字列ストリームstrstreamは本当に文字配列をラップしただけであり、メモリ管理がクラスと使用者の間で行ったり来たりするので非推奨。 stringstreamを使うこと。 IO系インスタンスをbool型へ変換した場合、!fail()と同等。 fail()は(rdstate() & (ios::bad…