組み込みでもよく使う標準 C++ ライブラリ

2020年1月22日

今回はどちらかというと個人用メモです。

コードを書いていて「この関数のヘッダ何やったっけ?」と思うことが多いので、クイックリファレンスを作りました。

C++03

<cassert>

assert をうまく使えば、あってはならない条件に掛かってしまうことを早期に発見できます。リリース時には NDEBUG で除去することを忘れずに。

void assert(int expression)
NDEBUG

<climits>

自前で -2147483648 と書いてしまうと、範囲外の値を符号反転していることになるため、未定義動作となります。INT_MIN を使いましょう。

int INT_MIN
int INT_MAX

<cstring>

文字列だけでなく、メモリ操作も実はここです。

void *memcpy(void *dst, const void *src, size_t num)
void *memset(void *ptr, int value, size_t num)

<cmath>

ここには整数を扱う関数がない点に注意。なお C++ では、float と double の違いは関数オーバーロードで実現されています。float であることを明示したいときは、サフィックス 'F’ をお忘れなく。

float fabs(float x)
float sin(float x)
float cos(float x)
float tan(float x)
float exp(float x)
float log(float x)
float log10(float x)
float ceil(float x)
float floor(float x)
float pow(float x)
float sqrt(float x)

<cstddef>

忘れがちですが、これらを使うのにもインクルードが必要です。

NULL
size_t

<cstdlib>

整数を扱う関数はここです。

int abs(int x)
int atoi(const char *str)
double atof(const char *str)
long strtol(const char *s, char **endp, int base)
div_t div(int numerator, int denominator)
lldiv_t lldiv(long long numerator, long long denominator)

<algorithm>

min/max を自前で書くか標準のものを使うかは、悩ましいところです。

template <class T> const T &min(const T &a, const T &b);
template <class T> const T &max(const T &a, const T &b);

<bitset>

組み込みのプログラムでは、標準の bitset をうまく使いたいものです。

template <size_t N> class bitset

<new>

placement new を使用するときに限り、このヘッダが必要になります。

C++11

<climits>

これらは C++11 から導入されたもののようです。要注意。

long long LLONG_MIN
long long LLONG_MAX

<cstdint>

これらの定義も実は C++11 です。遅すぎる。

int8_t
int16_t
int32_t
int64_t
uint8_t
uint16_t
uint32_t
uint64_t

<array>

C++11 では、生の配列の代わりにこちらを使いたいものです。

template <class T, size_t N> struct array

<functional>

C++11 では、生の関数ポインタの代わりにこちらを使いたいものです。

template <class> class function