c assert assertion handling c with examples
このC ++アサーションチュートリアルは、プログラマーが作成したプログラムの仮定をテストするためのステートメントであるC ++のアサーションに光を当てます。
品質保証と品質管理の違いは何ですか?
C ++プログラムでは、通常、配列インデックスのようなプログラムではゼロより大きいと仮定します。
これらの仮定が満たされると、プログラムは正常に実行されますが、これらの仮定が偽になると、プログラムは正常に終了しません。
=> 専門家による完全なC ++コースについては、こちらをご覧ください。
学習内容:
C ++でのアサーション
アサーションは、上記で説明したような条件をテストするC ++のステートメントです。条件が真の場合、プログラムは正常に続行され、条件が偽の場合、プログラムは終了し、エラーメッセージが表示されます。
アサーションプリプロセッサマクロを使用してアサーションを提供できます。
整数myIntを使用すると、次のようにmyIntが0より大きい必要があるというアサーションを宣言できます。
assert (myInt > 0);
指定されたmyIntの値が-1であるとすると、myIntの値が-1であるため、コンパイラーが上記のステートメントを検出すると、アサーションは失敗します。アサーションが失敗すると、プログラム名と行番号とともに無効なアサーションを示すメッセージが発行され、プログラムが終了します。
assertの一般的なプロトタイプは次のとおりです。
assert(condition)where condition =>スカラー型の式
アサートは、条件式を評価するために使用されるプリプロセッサマクロです。条件式がfalseと評価された場合、プログラムはエラーメッセージを表示した後に終了します。エラーメッセージは通常、失敗した条件式、コードファイルの名前、およびアサートの行番号で構成されます。
したがって、問題が発生した場所と、コードで発生した問題を知ることができます。したがって、アサーションを使用すると、デバッグがより効率的になります。
C ++ヘッダー< キャサート >アサート機能が含まれています。ほとんどの場合、コードでアサート機能を使用して、関数に渡されたパラメーターが有効かどうかを確認したり、関数の戻り値を確認したり、配列の境界を確認したりします。
C ++アサーションの基本的な例。
#include #include using namespace std; void display_number(int* myInt) { assert (myInt!=NULL); cout<<'myInt contains value' << ' = '<<*myInt< 出力:
上記のプログラムでは、display_number関数に式(myInt!= NULL)を含むassert呼び出しを使用しました。最初にmain関数で、変数myptrのアドレスを含むポインター変数second_ptrを渡します。この呼び出しが行われると、アサートはtrueになります。したがって、プログラムの実行は正常であり、値が表示されます。
display_numberへの2番目の呼び出しでは、nullポインターを渡し、それによってassertをfalseにします。したがって、2番目の呼び出しが行われると、アサーションに失敗したというメッセージが出力に示されているように表示されます。
NDEBUGによるアサーションの無効化
アサーションを使用する場合、実行時にチェックされます。 アサーションはデバッグを効率的にしますが、アプリケーションのリリースビルドにアサーションを含めないように注意する必要があります。 これは、アプリケーションをリリースするときは、アプリケーションが徹底的にテストされていることが確実な場合にのみ実行することがわかっているためです。
したがって、ソフトウェアをリリースするときに、すべてのアサーションを無効にする必要があります。 NDEBUGマクロを使用して、プログラムのアサーションを無効にできます。プログラムでNDEBUGマクロを使用すると、アサートするすべての呼び出しが無効になります。
プログラムに以下の行を含めて、すべてのアサートステートメントを無効にすることができます。
#define NDEBUG
次のC ++プログラムは、NDEBUGがコメント化されたとき、およびNDEBUGがアクティブなときのプログラムの動作を示しています。
#1)NDEBUGが指定されましたが、コメントされました。
#include // uncomment to disable assert() //#define NDEBUG #include using namespace std; int main() { assert(2+2==3+1); cout << 'Expression valid...Execution continues.
'; assert(2+2==1+1); cout << 'Asset disabled...execution continuous with invalid expression
'; }
出力:
Windows10で.jarファイルを実行する方法
このプログラムでは、#define NDEBUGステートメントを指定しましたが、コメントが付けられています。これは、assertステートメントがアクティブであることを意味します。したがって、プログラムが実行されると、assertの2番目の呼び出しはfalseを返し、エラーメッセージが点滅し、プログラムは中止されます。
#2)NDEBUGがアクティブです。
#include // uncomment: assert() disabled #define NDEBUG #include using namespace std; int main() { assert(2+2==3+1); cout << 'Expression valid...Execution continues.
'; assert(2+2==1+1); cout << 'Assert disabled...execution continuous with invalid expression
'; }
出力:
このプログラムでは、NDEBUGマクロのコメントを解除しました。これで、プログラムを実行すると、assertステートメントはアクティブではなくなります。したがって、assertステートメントの2番目の条件がfalseの場合でも、プログラムは通常の実行を継続します。
したがって、行#define NDEBUGのコメントを解除することにより、プログラムのassertステートメントを無効にしました。
アサートとstatic_assert
これまで見てきたアサーションは実行時に実行されます。 C ++は、static_assertと呼ばれるさらに別の形式のアサーションをサポートし、コンパイル時のアサーションチェックを実行します。 C ++ 11以降に存在します。
static_assertの一般的な構文は次のとおりです。
static_assert (bool_constexpr, message)
ここでbool_constexpr => cContextuallyに変換されたbool型の定数式。
メッセージ=> bool_constexprがfalseの場合にエラーメッセージとして表示される文字列。
したがって、bool_constexprがtrueと評価された場合、プログラムは正常に進行します。 bool_constexprがfalseと評価された場合、コンパイラエラーが発行されます。
以下のプログラムは、C ++プログラムでのstatic_assertの使用法を示しています。
#include #include using namespace std; int main() { assert(2+2==3+1); static_assert(2+2==3+1, '2+2 = 3+1'); cout << 'Expression valid...Execution continues.
'; assert(2+2==1+1); static_assert(2+2==1+1, '2+2 != 1+1'); cout << 'Assert disabled...execution continuous with invalid expression
'; }
出力:
上記のプログラムでは、static_assertに式とメッセージを提供しています。失敗すると、出力に示すようにコンパイラエラーが発行されます。
よくある質問
Q#1)C ++のアサートとは何ですか?
Excelでテストケースを書く方法
回答: C ++のアサーションは、プログラムで設定された特定の仮定をテストするために使用できる事前定義されたマクロです。 assertステートメントの条件式がtrueに設定されている場合、プログラムは正常に続行されます。ただし、式がfalseの場合、エラーメッセージが発行され、プログラムは終了します。
Q#2)static_assertとは何ですか?
回答: Static_assertは、実行時に評価されるassert()ステートメントに対して、コンパイル時に評価されます。
Static_assertは、C ++ 11以降のC ++に組み込まれています。条件式とメッセージを引数として表示します。条件がfalseと評価されると、コンパイラエラーが発行され、メッセージが表示されます。その後、プログラムは終了します。
Q#3)assert()マクロの目的は何ですか?
回答: Assert()マクロは、プログラムで発生してはならない条件または仮定をテストするために使用されます。 例えば、 配列インデックスは常に> 0である必要があります。別の仮定は2+ 2 == 3 +1である可能性があります。
したがって、assert()を使用すると、そのような仮定をテストでき、それらがtrueと評価される限り、プログラムは正常に実行されます。それらがfalseの場合、プログラムは終了します。
結論
このチュートリアルでは、C ++でassert()ステートメントが機能することを確認しました。 assert()ステートメントはヘッダーで定義されています。 NDEBUGマクロを使用してアサートを無効にできます。開発者は、本番コードが徹底的にテストされ、バグがないことが期待されるため、本番コードでassertを使用できないように注意する必要があります。
assert()ステートメントとは別に、C ++ 11はコンパイル時に評価されるstatic_assert()もサポートします。 static_asset()がfalseと評価されると、コンパイラエラーが発行され、プログラムが終了します。
アサーションはプログラム内の仮定をテストする方法であり、アサーション内の条件式を評価することにより、プログラムを徹底的にテストでき、デバッグがより効率的になります。
=> ここですべてのC ++チュートリアルを確認してください。
推奨読書