C++入門
英語情報
Tour of C++
C++.com チュートリアルなどがある。投稿は古いが記事にRatingがある。 Code
Standard Library
標準ライブラリの実装がいくつかある。
microsoft/STL https://img.shields.io/github/stars/microsoft/STL.svg MSVC's implementation of the C++ Standard Library. llvm/llvm-project https://img.shields.io/github/stars/llvm/llvm-project.svg The LLVM Project is a collection of modular and reusable compiler and toolchain technologies. gcc-mirror/gcc https://img.shields.io/github/stars/gcc-mirror/gcc.svg GNU electronicarts/EASTL https://img.shields.io/github/stars/electronicarts/EASTL.svg It is an extensive and robust implementation that has an emphasis on high performance. 日本語情報
Caddy C++勉強会
アドベントカレンダー
エディタ情報
https://www.youtube.com/watch?v=Kz5NQiji9YU&t=930s
https://www.youtube.com/watch?v=Bt0sZNhXW7k
最初に躓いたこと
標準のディレクトリ構成は
ビルドツール : CMake
ライブラリとバイナリ
オブジェクトファイル : ソースファイルをコンパイルしたもの。バイナリファイルと同じ。
実行ファイル : オブジェクトファイルをリンカでリンク
C++コンパイラ : GCC(g++で実行/gccは重複するため), Clang
拡張子
cpp, cc や h, hh, hppなどあるが、どれでもよい。
モダンにしたければ、cpp/hppの組み合わせ。
ビルドの仕組み
https://gyazo.com/2c8f1b5e0425a74e857900c4ce280f5d
プリプロセッサ : コンパイルの準備
コンパイラ : C++をアセンブリ言語に変換
アセンブラ : アセンブリ言語から機械語に変換。生成されたファイルをオブジェクトファイル/バイナリファイルと呼ぶ
リンカ : 複数のオブジェクトファイルを1つにまとめる(リンク)。実行ファイルと呼ぶ。リンクには種類がある
CMake, CMakeLists.txtとはなにか
OS/コンパイラに依存せず、Makefileなどを含むプロジェクトファイルを生成する。
code:cmake
$ cd some_software-1.4.2
$ mkdir build
$ cd build
$ cmake .. -DCMAKE_INSTALL_PREFIX=/opt/the/prefix #
$ cmake --build . # CMAKE_MAKE_PROGRAMで指定したプログラムでビルドを行う.make, ninja, xcodebuildなど
CMakeではconfigure相当(ビルド環境の確認と準備)をしてくれる。
cmakeは独自の構文で記述する、configureに比べ動作が速い。
CMakeLists.txtはcmakeファイルのエントリポイントになるファイル。
xxx.cmakeのファイルを直接実行することもできる。
Bazel, Mesonも同様の目的で利用される。
headerファイル
拡張子.h/hpp など。
主に以下の2つの用途がある。
複数のファイルで利用する関数/クラス/定数/プリプロセッサ(#includeなど)をまとめる
cppで実行するインターフェースを記述する (実行コードの記述順序による依存を解決できる)
ただし、ヘッダーファイルに実行コードを記述し、完結しているライブラリも存在する。
ヘッダファイルしかないレポジトリは何?
header-only-library、 single-header-libraryと呼ぶ。
最近流行り。オブジェクトファイルを作らない。
メリット : 呼び出すときに面倒な設定が不要。依存先でも修正が用意
header-only-libraryの場合、関数定義時にinline をつけて呼び出す際の衝突を防ぐ
プリプロセッサ
C/C++の言語機能の一つ。テキストの置換をしているだけ。
外部ライブラリで利用されているコードのバージョン(C++17,20)はどこで判断するのか
書いてなければデフォルトのバージョンが利用される。
プリプロセッサでコンパイラに応じて、コードを変更することが可能。
外部のライブラリを読み込む方法
パッケージマネージャは何を使う
色々あるけど有名なレポジトリは、 third_partyにgit submoduleで管理していることが多い印象
写経におすすめのライブラリ
標準ライブラリが複数あるのはなぜ
共通の設計書をもとに、各コンパイラの設計者がそれぞれ作っていく
Dockerfile
テストライブラリ
bazel+CLionとの組み合わせ
CLionではCmakeLists.txtが前提となってデバッグなどができる。bazelのビルドファイルがあれば、bazel-cmakelistsを利用してCmakeLists.txtを自動生成できる。 仮想関数(virtual)はinterfaceと同じ?
同じ。
テンプレートはジェネリクスと同じ?
目的はジェネリクスと同じだと思うが、
テンプレート(template)は、クラス/関数を生成する。
class と struct
クラスの定義に使う。デフォルトのアクセス指定子が違う
~Class : デコンストラクタ
code:class
class Object
{
public:
Object() = default // Object() {}と同じ
~Object() = default
};
constexpr
constant expression (定数式)。コンパイル時も実行時も呼び出せる。
auto
型推論してくれる。プリミティブな型を直接指定すると初見の人が読みやすい。
optional型などはautoを利用するくらいの気持ち
非同期処理
std::futureを利用する
std::future<type> futureSample = std::async(std::launch::async, &class::run, &class);
なお、std::launch::deferredを利用すると、getかwaitを呼び出し時に実行する。(評価を遅延させる)
先頭の文字
特に定義はないが、以下のようなルールで考える。
グローバル関数 : 大文字
メンバー関数 : 小文字
goでいうchannelみたいに必要時のみ通知したい
condition_variableを利用する。通知のみ ( chan struct{}{} )。
ラムダ式
code:lambda
[](){}
this() {} // thisで束縛されてる変数を利用できる &(){} // 参照キャプチャ。*this と同じ意味。thisのポインタを束縛 =(){} // コピーキャプチャ。=, this と同じ意味。thisをコピーして束縛する 複数の型をもちたい variant
継承関係にない複数の型を、単一のオブジェクトに代入・切り替えができる。
TypeScriptでいうUnionのようなことができる。
const修飾されたメンバ関数 : メンバ変数を変更できない
メンバ変数を変更しないことがわかるようになる。
また、constオブジェクトの場合、const修飾メンバ関数しか使えなくなる。
code:const
class A {
public:
private:
const void sample();
const void constSample() const;
const bool flg;
}
const a = A;
a.constSample()
a.sample(); // できない
型alias宣言 : typedef, using
typedefよりもusingを利用するほうが可読性があがりやすい
メンバ初期化指定子
code:member
class Sample {
public:
Sample(const int a, const int b): adash(a),bdash(b) {}
private:
int adash;
int bdash;
};
class Sample2 {
public:
Sample2(const int a, const int b) {
adash = a;
bdash= b;
}
private:
int adash;
int bdash;
};
Constructor():<メンバ初期化指定子>{} のように書く。
Sample, Sample2はほとんど同じ。
constメンバ変数がある場合は、メンバ初期化指定子を利用して設定しなければならない。
クラッシュログの収集など