
C言語の静的アサーション_Static_assertと動的アサーションassertマクロの使い方を教えて!
こういった悩みにお答えします.
本記事の信頼性
- リアルタイムシステムの研究歴12年.
- 東大教員の時に,英語でOSの授業.
- 2012年9月~2013年8月にアメリカのノースカロライナ大学チャペルヒル校コンピュータサイエンス学部(2021年の世界大学学術ランキングで20位)で客員研究員として勤務.C言語でリアルタイムLinuxの研究開発.
- プログラミング歴15年以上,習得している言語: C/C++,Solidity/Vyper,Java,Python,Ruby,HTML/CSS/JS/PHP,MATLAB,Assembler (x64,ARM).
- 東大教員の時に,C++言語で開発した「LLVMコンパイラの拡張」,C言語で開発した独自のリアルタイムOS「Mcube Kernel」をGitHubにオープンソースとして公開.
こういった私から学べます.
目次
静的アサーション_Static_assertと動的アサーションassertマクロ
C言語の静的アサーション_Static_assertと動的アサーションassertマクロを紹介します.
ここで,アサーション(表明)とは,記述した条件式が偽の場合,エラーや例外を発生させたり,メッセージを表示させたりして処理を中断または強制終了することを言います.
アサーションを利用することで,効率的にデバッグできます.
静的アサーション_Static_assert
静的アサーション_Static_assertは,C11規格から採用された静的(コンパイル時)にアサーションを行います.
_Static_assertの構文は以下になります.
1 2 3 |
static_assert-declaration: _Static_assert ( constant-expression , string-literal ) ; _Static_assert ( constant-expression ) ; |
_Static_assertのエイリアスとして,assert.hにstatic_assertマクロが定義されています.
本記事のコードでは,static_assertを利用します.
動的アサーションassertマクロ
1 |
void assert(scalar expression); |
assertマクロは,動的(プログラム実行時)にアサーションを行います.
※assertは関数のようにに見えますが実際はマクロです.
assertマクロを利用すると,コードのバグを見つけたり,例外的な場面を(限定的なデバッグ出力を行う)クラッシュで処理するのに役立ちます.
assertマクロもassert.hで定義されています.
_Static_assertとassertの使い方
_Static_assertとassertの使い方は以下になります.
コードではstatic_assertを利用しています.
static_assertは「sizeof(int) == INTSIZE」の場合はコンパイルが成功しますが,そうでない場合はエラーになります.
assertはscanf関数で入力したint型の変数iの値が1の場合は正常に実行できますが,そうでない場合はアサーションが発生します.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
/* * Author: Hiroyuki Chishiro * License: 2-Clause BSD */ #include <stdio.h> #include <assert.h> #ifndef INTSIZE #define INTSIZE 4 #endif int main(void) { int i; static_assert(sizeof(int) == INTSIZE, "The size of integer must be 4-byte."); printf("Please input an integer: "); scanf("%d", &i); assert(i == 1); return 0; } |
static_assertを試すコンパイル方法は以下になります.
GCCのオプションをつけない場合や-DINTSIZE=4の場合はコンパイルが成功しています.
これに対して,-DINTSIZE=8の場合はアサーションによりコンパイルが失敗したことがわかります.
1 2 3 4 5 6 7 8 |
$ gcc assert.c $ gcc assert.c -DINTSIZE=4 $ gcc assert.c -DINTSIZE=8 In file included from assert.c:6: assert.c: In function 'main': assert.c:16:3: error: static assertion failed: "The size of integer must be 4-byte." 16 | static_assert(sizeof(int) == INTSIZE, "The size of integer must be 4-byte."); | ^~ |
assertを試す実行方法は以下になります.
3行目で1を入力した場合はプログラムが正常に終了しました.
5行目で0を入力した場合はアサーションが発生し,プログラムが強制終了していることがわかります.
1 2 3 4 5 6 7 |
$ gcc assert.c $ a.out Please input an integer: 1 $ a.out Please input an integer: 0 a.out: assert.c:20: main: Assertion `i == 1' failed. IOT instruction (core dumped) a.out |
まとめ
C言語の静的アサーション_Static_assertと動的アサーションassertマクロの使い方を紹介しました.
どちらも有用ですので,うまく使い分けましょう!
デバッグに有用なGDB,静的コード解析ツールと動的プログラム解析ツールを知りたいあなたはこちらからどうぞ.
-
-
【C言語】GDBでプログラムを効率的にデバッグ
こういった悩みにお答えします. こういった私が解説していきます. 目次1 GNU Debugger(GDB)2 GDBの簡単な利用例2.1 GDBなしで実行2.2 GDBありで実行3 GDBによるステ ...
続きを見る
-
-
【C/C++言語】静的コード解析ツールと動的プログラム解析ツール
こういった悩みにお答えします. こういった私から学べます. 目次1 C/C++言語の静的コード解析ツール1.1 Clang Static Analyzer1.2 Cppcheck1.3 FlawFin ...
続きを見る
C言語を独学で習得することは難しいです.
私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.
私のキャパシティもあり,一定数に達したら終了しますので,今すぐ追加しましょう!
独学が難しいあなたは,元東大教員がおすすめするC言語を学べるオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!