#defineの使い方

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
asahi
記事: 8
登録日時: 5年前

#defineの使い方

#1

投稿記事 by asahi » 5年前

組み込み系のプログラムを勉強しています。最近下記コードに遭遇しました。

コード:

#define assert_param(expr) ((void)0U)
引数チェックの関数であることはわかるんですが、それしか理解していないです。
どなたかご教授お願いします。

かずま

Re: #defineの使い方

#2

投稿記事 by かずま » 5年前

assert_param を使っているところはどうなっていますか?

例えば、次のように、デバッグ中はパラメータのチェックをしてバグを検出し、
デバッグが完了したら、((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));
}
このプログラムを実行して、3 と 7 を入力するとどうなりますか?

「わかりません」という答えでもかまいませんから、
この回答中の質問にはすべて答えてください。

asahi
記事: 8
登録日時: 5年前

Re: #defineの使い方

#3

投稿記事 by asahi » 5年前

回答ありがとうございます。
assert_param を使っているところは下記のようになっています。

コード:

  /* Check Direction parameter */
  assert_param(IS_SPI_DIRECTION_2LINES(hspi->Init.Direction));
IS_SPI_DIRECTION_2LINESの定義↓

コード:

#define IS_SPI_DIRECTION_2LINES(MODE) ((MODE) == SPI_DIRECTION_2LINES)
<このプログラムを実行して、3 と 7 を入力するとどうなりますか?>
⇒すみません、今、実行環境がないのでわかりません。

assert_param(IS_SPI_DIRECTION_2LINES(hspi->Init.Direction));の処理内容は
おそらくhspi->Init.DirectionがSPI_DIRECTION_2LINES意外だと実行を停止する処理だと思います。

返信

“C言語何でも質問掲示板” へ戻る