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 の違いがわかる。
最近のコメント