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 の違いがわかる。

前回次回