組み込み系のプログラムを勉強しています。最近下記コードに遭遇しました。
引数チェックの関数であることはわかるんですが、それしか理解していないです。
どなたかご教授お願いします。
#defineの使い方
Re: #defineの使い方
assert_param を使っているところはどうなっていますか?
例えば、次のように、デバッグ中はパラメータのチェックをしてバグを検出し、
デバッグが完了したら、((void)0U) でチェックを外すようにしているのでは
ありませんか?
このプログラムを実行して、3 と 7 を入力するとどうなりますか?
「わかりません」という答えでもかまいませんから、
この回答中の質問にはすべて答えてください。
例えば、次のように、デバッグ中はパラメータのチェックをしてバグを検出し、
デバッグが完了したら、((void)0U) でチェックを外すようにしているのでは
ありませんか?
#include <stdio.h>
#include <stdlib.h>
#define DEBUG 1
#if defined(DEBUG)
#define assert_param(expr) \
((expr) || (printf("%d: [%s]\n", __LINE__, #expr), abort(), 0))
#else
#define assert_param(expr) ((void)0U)
#endif
int get(unsigned int n)
{
int tab[7] = { 31, 41, 59, 26, 57, 53, 23 };
assert_param(n < 7); // この条件を満たさないと中断
return tab[n];
}
int main(void)
{
int n;
while (scanf("%d", &n) == 1)
printf(" tab[%d] = %d\n", n, get(n));
}
「わかりません」という答えでもかまいませんから、
この回答中の質問にはすべて答えてください。
Re: #defineの使い方
回答ありがとうございます。
assert_param を使っているところは下記のようになっています。 IS_SPI_DIRECTION_2LINESの定義↓ <このプログラムを実行して、3 と 7 を入力するとどうなりますか?>
⇒すみません、今、実行環境がないのでわかりません。
assert_param(IS_SPI_DIRECTION_2LINES(hspi->Init.Direction));の処理内容は
おそらくhspi->Init.DirectionがSPI_DIRECTION_2LINES意外だと実行を停止する処理だと思います。
assert_param を使っているところは下記のようになっています。 IS_SPI_DIRECTION_2LINESの定義↓ <このプログラムを実行して、3 と 7 を入力するとどうなりますか?>
⇒すみません、今、実行環境がないのでわかりません。
assert_param(IS_SPI_DIRECTION_2LINES(hspi->Init.Direction));の処理内容は
おそらくhspi->Init.DirectionがSPI_DIRECTION_2LINES意外だと実行を停止する処理だと思います。