C++入門
英語情報
Standard C++ C++の最新情報などがまとまっている
Tour of C++
https://isocpp.org/images/uploads/2-Tour-Basics.pdf
https://isocpp.org/images/uploads/3-Tour-Abstr.pdf
https://isocpp.org/files/papers/4-Tour-Algo-draft.pdf
https://isocpp.org/files/papers/5-Tour-Util.pdf
C++ Core Guideline
https://github.com/isocpp/CppCoreGuidelines
Guideline Checkers
C++ reference レファレンス
C++.com チュートリアルなどがある。投稿は古いが記事にRatingがある。
Google C++ Style Guideline 日本語
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.
日本語情報
C++の歩き方
標準ライブラリ一覧 https://cppmap.github.io/standardization/header/
江添亮のC++入門 書籍版もある
Caddy C++勉強会
1. ポインターについて https://github.com/EzoeRyou/cpp-tips/blob/master/slide/002-reference.md
2. テンプレート基礎
3. メタプログラミング
4. C++標準規格の用語解説
5. 標準変換、オーバーロード解決、テンプレートの実引数推定
6. 派生と継承、Type Erasure
7. type erasureの続きとexpression templates
8. C++20の機能紹介と一時オブジェクトの寿命
9. コンセプト
10. テンプレートの同一性、C++20の新機能解説
11. volatile、std::launder、PODやstandard layout型の歴史など
アドベントカレンダー
2019 一人
2018
2017 初心者向け
2016 初心者向け
2015 初心者向け
エディタ情報
CLion Blog
https://www.youtube.com/watch?v=Kz5NQiji9YU&t=930s
https://blog.jetbrains.com/clion/2020/05/webinar-recording-clion-ama/
https://www.youtube.com/watch?v=Bt0sZNhXW7k
Timetable : https://blog.jetbrains.com/clion/2020/05/learn-productivity-with-clion-tips-tricks-demo/#more-7379
CLion x ClangFormat : https://pleiades.io/help/clion/clangformat-as-alternative-formatter.html
最初に躓いたこと
標準のディレクトリ構成は
https://github.com/filipdutescu/modern-cpp-template
ビルドツール : CMake
フォーマッタ : http://clang.llvm.org/docs/ClangFormatStyleOptions.html
テスト : https://github.com/google/googletest/
ライブラリとバイナリ
オブジェクトファイル : ソースファイルをコンパイルしたもの。バイナリファイルと同じ。
実行ファイル : オブジェクトファイルをリンカでリンク
C++コンパイラ : GCC(g++で実行/gccは重複するため), Clang
拡張子
cpp, cc や h, hh, hppなどあるが、どれでもよい。
モダンにしたければ、cpp/hppの組み合わせ。
ビルドの仕組み
https://gyazo.com/2c8f1b5e0425a74e857900c4ce280f5d
https://kamino.hatenablog.com/entry/c%2B%2B-principle-of-build-library
プリプロセッサ : コンパイルの準備
コンパイラ : C++をアセンブリ言語に変換
アセンブラ : アセンブリ言語から機械語に変換。生成されたファイルをオブジェクトファイル/バイナリファイルと呼ぶ
リンカ : 複数のオブジェクトファイルを1つにまとめる(リンク)。実行ファイルと呼ぶ。リンクには種類がある
CMake, CMakeLists.txtとはなにか
https://cmake.org/cmake/help/latest/index.html
OS/コンパイラに依存せず、Makefileなどを含むプロジェクトファイルを生成する。
主に以下のようにして利用する https://cmake.org/cmake/help/latest/guide/user-interaction/index.html#id4
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 --build . --target install # ビルドの詳細を指定できる https://cmake.org/cmake/help/latest/guide/user-interaction/index.html#selecting-a-target
https://kamino.hatenablog.com/entry/cmake_tutorial1
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で管理していることが多い印象
写経におすすめのライブラリ
ライブラリとして公開したいなら : https://github.com/boostorg
標準ライブラリが複数あるのはなぜ
共通の設計書をもとに、各コンパイラの設計者がそれぞれ作っていく
Dockerfile
https://github.com/tomoyamachi/cpp-request-container/blob/master/Dockerfile
テストライブラリ
https://github.com/google/googletest/ https://img.shields.io/github/stars/google/googletest.svg
https://github.com/catchorg/Catch2 https://img.shields.io/github/stars/catchorg/catch2.svg
https://github.com/cpputest/cpputest https://img.shields.io/github/stars/cpputest/cpputest.svg
https://github.com/unittest-cpp/unittest-cpp https://img.shields.io/github/stars/unittest-cpp/unittest-cpp.svg
bazel+CLionとの組み合わせ
CLionではCmakeLists.txtが前提となってデバッグなどができる。bazelのビルドファイルがあれば、bazel-cmakelistsを利用してCmakeLists.txtを自動生成できる。
仮想関数(virtual)はinterfaceと同じ?
同じ。
テンプレートはジェネリクスと同じ?
目的はジェネリクスと同じだと思うが、
テンプレート(template)は、クラス/関数を生成する。
class と struct
クラスの定義に使う。デフォルトのアクセス指定子が違う
~Class : デコンストラクタ
https://gist.github.com/Reputeless/4d91b665876a2b97f2c5f48a2f9baf35
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メンバ変数がある場合は、メンバ初期化指定子を利用して設定しなければならない。
クラッシュログの収集など
https://backtrace.io
https://github.com/getsentry/sentry-native