C 言語 マクロ講座 基礎編(2)2007年03月16日 11時11分33秒

マクロの条件式には二つの形式がある。

#if と #ifdef だ。この二つは、マクロで条件分岐をするための命令だが、微妙に動作が異なる。これを間違えて使うと、異図しない動作を起こしかね無い。

#if はそれに続く式の評価の値で条件が分岐される。 #ifdef は引数がどんな値であれ、 #define されていれば真となる。#ifdef MACRO の動作は #if defined(MACRO) と同じだ。

#ifdef と逆の意味の #ifndef もある。こちらは #if !defined(MACRO) と等価になる。

各々の違いを一度に試してみる。


% cat if-ifdef.sh 
echo '#define TEN 10'
echo '#define ZERO 0'
echo '#define TEXT "TEXT"'
echo '#define NONAME'

for i in TEN ZERO TEXT NONAME
do
  for j in '#ifdef %s' '#if %s' '#if defined(%s)'
  do
    #echo -e "\"$i\" with $j"
    printf "result of $j\n" "\"$i\""
    printf "$j\n" $i
    echo $i X
    echo '#endif'
  done
done


% sh if-ifdef.sh
#define TEN 10
#define ZERO 0
#define TEXT "TEXT"
#define NONAME
result of #ifdef "TEN"
#ifdef TEN
TEN X
#endif
result of #if "TEN"
#if TEN
TEN X
#endif
result of #if defined("TEN")
#if defined(TEN)
TEN X
#endif
result of #ifdef "ZERO"
#ifdef ZERO
ZERO X
#endif
result of #if "ZERO"
#if ZERO
ZERO X
#endif
result of #if defined("ZERO")
#if defined(ZERO)
ZERO X
#endif
result of #ifdef "TEXT"
#ifdef TEXT
TEXT X
#endif
result of #if "TEXT"
#if TEXT
TEXT X
#endif
result of #if defined("TEXT")
#if defined(TEXT)
TEXT X
#endif
result of #ifdef "NONAME"
#ifdef NONAME
NONAME X
#endif
result of #if "NONAME"
#if NONAME
NONAME X
#endif
result of #if defined("NONAME")
#if defined(NONAME)
NONAME X
#endif


% sh if-ifdef.sh | gcc -E -
# 1 ""
# 1 ""
# 1 ""
# 1 ""




result of #ifdef "TEN"

10 X

result of #if "TEN"

10 X

result of #if defined("TEN")

10 X

result of #ifdef "ZERO"

0 X

result of #if "ZERO"



result of #if defined("ZERO")

0 X

result of #ifdef "TEXT"

"TEXT" X

result of #if "TEXT"



result of #if defined("TEXT")

"TEXT" X

result of #ifdef "NONAME"


 X

result of #if "NONAME"



result of #if defined("NONAME")

 X

注意深く見ると、#if と #ifdef の違いがわかる。

前回次回

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://uyota.asablo.jp/blog/2007/03/16/1274038/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。