2024年3月17日日曜日

cppでconst値を参照してエラーを出したいときはstatic_assertが使える


背景

cppで固定値(const値)を参照してビルド時にエラーを出すのはstatic_assertを使えば良いと分かったので、利用例を備忘録として記事に残します。

使ったもの

c++11かそれより新しいc++の環境

利用例

const値を参照して条件を記述し、その条件に合わなかったときに第2引数で渡した警告文をビルドエラーとして表示させれます。
const int a = 0;
const int b = a + 1;
const int c = b + 1;
const int d = c + 2; // wrong adding 2
static_assert(d == 3, "d sould be 3");

ビルド時のエラー
main.cpp:6:17: error: static assertion failed: d sould less than 3
6 | static_assert(d < 4, "d sould less than 3");
| ~~^~~

VSCodeを利用すれば、静的解析時に異常を検知してくれます。

条件の記述にはcastや演算式も利用可能です。
const unsigned char sizeA = 50;
const unsigned char sizeB = 50;
const unsigned char sizeC = 50;
const unsigned char sizeD = 50;
const unsigned char sizeE = 60;
static_assert((int)sizeA + sizeB + sizeC + sizeD + sizeE <= 0xff,
"total size sould less or equal 0xff");

やれても良さそうだができないこと: constでない変数は識別不能

関数の中で定義して操作したconstでない変数はstatic_assertの対象外でした。
int main() {
int a = 0;
++a;
++a;
static_assert(a < 2, "a sould less than 2"); // できない
return 0;
}

おわり

const値とstatic_assertを利用してビルドや静的解析でエラーを出せました。
要所で活用すると不具合を防げそうです。

参考

static_assertの存在を知ったstack overflowのスレッドです。
Best way to trigger a compile-time error if no if-constexpr's succeed?

static_assertの仕様紹介ページです。
static_assert declaration (since C++11)

0 件のコメント :