11

このコードを考えると:

#include <stdio.h>
#include <assert.h>

void print_number(int* somePtr) {
  assert (somePtr!=NULL);
  printf ("%d\n",*somePtr);
}

int main ()
{
  int a=1234;
  int * b = NULL;
  int * c = NULL;

  b=&a;

  print_number (c);
  print_number (b);

  return 0;
}

代わりにこれを行うことができます:

#include <stdio.h>
#include <assert.h>

void print_number(int* somePtr) {
  if (somePtr != NULL)
       printf ("%d\n",*somePtr);
  // else do something 
}

int main ()
{
  int a=1234;
  int * b = NULL;
  int * c = NULL;

  b=&a;

  print_number (c);
  print_number (b);

  return 0;
}

では、assert を使用して何が得られるのでしょうか。

よろしく

4

6 に答える 6

25

assert は、コード内の仮定を文書化することです。if ステートメントは、さまざまな論理シナリオを処理するためのものです。

あなたの特定のケースでは、 print_number() 関数の開発者の観点から考えてください。

たとえば、あなたが書くとき

void print_number(int* somePtr) {
  assert (somePtr!=NULL);
  printf ("%d\n",*somePtr);
}

あなたが言いたいのは、

私の print_number 関数では、来るポインターは常にnull ではないと想定しています。これが null の場合、私は非常に驚くでしょう。私のコードでは、このシナリオをまったく処理する必要はありません。

でも、こう書くと

void print_number(int* somePtr) {
  if (somePtr != NULL)
       printf ("%d\n",*somePtr);
  // else do something 
}

あなたは、私の print_number 関数で、人々が null ポインターを渡すことを期待していると言っているようです。そして、私はこの状況を処理する方法を知っており、else 条件でこれを処理します。

そのため、特定の状況に対処する方法を知っていて、それを実行したい場合があります。次に、if を使用します。何かが起こらないと思い込み、それを処理する気にならないことがあります。驚きを表明し、そこでプログラムの実行を assert で停止するだけです。

于 2012-07-13T10:45:53.590 に答える
12

違いは、デバッグビルドassertでのみ有効になることです。リリースビルドでは有効になっていません(つまり、が定義されている場合)。つまり、リリース ビルドではチェックされません。その結果、リリースビルドにも残っている条件を使用するコードと比較して、コードは少し速くなります。NDEBUGif

つまりassert、コードを記述するときに一般的なエラーをチェックし、開発フェーズ自体でできるだけ早くそれらをキャッチするために使用されます。

于 2012-07-13T10:47:06.147 に答える
9

多くの理由:

  1. アサートは通常、リリースビルドでは削除されます。
  2. アサートは、障害情報をクライアントに報告します。if()それ自体では何もしません。
  3. アサーションは通常マクロであるため、失敗したアサーションに関するコード情報を取得することもできます。
  4. アサートは、より意味的に明確ですif()
于 2012-07-13T10:50:29.930 に答える
7

アサーションが失敗した場合、失敗したアサーション自体に加えて、次のような関数と失敗したアサーションの行を含む出力が表示されます。

test: main.cpp:9: int main(): Assertion `0==1' failed.

したがって、実行時にプログラムがクラッシュした場合、クラッシュの正確な理由と場所が表示されます。wikiにアサーションに関する大きな記事があります。

于 2012-07-13T10:44:59.737 に答える
3

Assert は、何か問題が発生したこと、おそらくエラーが修正されることを通知します。デバッグ モードでは、バグの修正に役立つコールスタックが壊れて表示されます。したがって、使用するのは良い習慣です。リリースではアサートをオフにする必要があるため、実際には if() と assert を使用します。

void print_number(int* somePtr) {
  assert(somePtr != NULL);
  if (somePtr != NULL)
       printf ("%d\n",*somePtr);
  // else do something 
}

" // else do something " では、例外をスローしたり、エラー コードを返したりすることを考えるかもしれません。

于 2012-07-13T10:47:07.053 に答える