背景
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 件のコメント :
コメントを投稿