C言語の静的アサーション_Static_assertと動的アサーションassertマクロの使い方を教えて!
こういった悩みにお答えします.
本記事の信頼性
- リアルタイムシステムの研究歴12年.
- 東大教員の時に,英語でOS(Linuxカーネル)の授業.
- 2012年9月~2013年8月にアメリカのノースカロライナ大学チャペルヒル校(UNC)コンピュータサイエンス学部で客員研究員として勤務.C言語でリアルタイムLinuxの研究開発.
- プログラミング歴15年以上,習得している言語: C/C++,Python,Solidity/Vyper,Java,Ruby,Go,Rust,D,HTML/CSS/JS/PHP,MATLAB,Verse(UEFN), Assembler (x64,aarch64).
- 東大教員の時に,C++言語で開発した「LLVMコンパイラの拡張」,C言語で開発した独自のリアルタイムOS「Mcube Kernel」をGitHubにオープンソースとして公開.
- 2020年1月~現在はアメリカのノースカロライナ州チャペルヒルにあるGuarantee Happiness LLCのCTOとしてECサイト開発やWeb/SNSマーケティングの業務.2022年6月~現在はアメリカのノースカロライナ州チャペルヒルにあるJapanese Tar Heel, Inc.のCEO兼CTO.
- 最近は自然言語処理AIとイーサリアムに関する有益な情報発信に従事.
- (AI全般を含む)自然言語処理AIの論文の日本語訳や,AIチャットボット(ChatGPT,Auto-GPT,Gemini(旧Bard)など)の記事を50本以上執筆.アメリカのサンフランシスコ(広義のシリコンバレー)の会社でプロンプトエンジニア・マネージャー・Quality Assurance(QA)の業務委託の経験あり.
- (スマートコントラクトのプログラミングを含む)イーサリアムや仮想通貨全般の記事を200本以上執筆.イギリスのロンドンの会社で仮想通貨の英語の記事を日本語に翻訳する業務委託の経験あり.
こういった私から学べます.
C言語を独学で習得することは難しいです.
私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.
私のキャパシティもあり,一定数に達したら終了しますので,今すぐ追加しましょう!
独学が難しいあなたは,元東大教員がおすすめするC言語を学べるオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!
目次
静的アサーション_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言語を独学で習得することは難しいです.
私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.
私のキャパシティもあり,一定数に達したら終了しますので,今すぐ追加しましょう!
独学が難しいあなたは,元東大教員がおすすめするC言語を学べるオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!