<?xml version="1.0" encoding="utf-8" ?> 
<rdf:RDF   
   xmlns="http://purl.org/rss/1.0/"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xml:lang="ja">
  <channel rdf:about="http://www.cafeblo.com/programmer/">
  <title>プログラマーの独り言</title>
  <link>http://www.cafeblo.com/programmer/</link>
  <description>コンピュータ・ソフトウェアのプログラミングに関して調査したことや思ったことを綴ります。</description>
  <dc:language>ja-jp</dc:language>
  <items>
  <rdf:Seq>
		<rdf:li rdf:resource="http://www.cafeblo.com/programmer/entry-6b7626323cc32e89404584fd18e7c838.html"/>
		<rdf:li rdf:resource="http://www.cafeblo.com/programmer/entry-3ae550595f223aef42eb504699b357b4.html"/>
		<rdf:li rdf:resource="http://www.cafeblo.com/programmer/entry-4d85852599622cde9996744fa51d1276.html"/>
		<rdf:li rdf:resource="http://www.cafeblo.com/programmer/entry-b8320c649e45924f6f8547ce575fb17c.html"/>
   </rdf:Seq>
  </items>
 </channel>
  <item rdf:about="http://www.cafeblo.com/programmer/entry-6b7626323cc32e89404584fd18e7c838.html">
  <title>関数形式マクロでの引数省略</title>
  <link>http://www.cafeblo.com/programmer/entry-6b7626323cc32e89404584fd18e7c838.html</link>
  <description>関数形式マクロでは、引数の省略も可能。

その場合、マクロ呼び出しでの実引数の数は、
マクロ定義内の省略記号(...)を除く仮引数の数よりも
多くなければならない。

識別子__VA_ARGS__が省略された引数を表す。
__VA_ARGS__は、仮引数に省略記号を用いる関数形式マクロの
置換要素並びの中だけで使用可能。

例：
／＊
　　　　ｅｘ＿ｄｅｆｉｎｅ＿ｖａ．ｃ
＊／
＃ｉｎｃｌｕｄｅ　＜ｓｔｄｉｏ．ｈ＞　　／＊　ｐｒｉｎｔｆ　＊／
＃ｉｎｃｌｕｄｅ　＜ｓｔｄｌｉｂ．ｈ＞　／＊　ＥＸＩＴ＿ＳＵＣＣＥＳＳ　＊／

＃ｄｅｆｉｎｅ　ＤＢＧ（．．．）　（ｆｐｒｉｎｔｆ（ｓｔｄｅｒｒ，　＿＿ＶＡ＿ＡＲＧＳ＿＿））

ｉｎｔ　ｍａｉｎ（ｉｎｔ　ａｒｇｃ，　ｃｈａｒ　＊ａｒｇｖ［］）
｛
　　　　ｉｎｔ　ｘ　＝　１００；

　　　　ＤＢＧ（”ｘ：％ｄ＼ｎ”，　ｘ）；

　　　　ｒｅｔｕｒｎ　ＥＸＩＴ＿ＳＵＣＣＥＳＳ；
｝
</description>
	<dc:creator>176454</dc:creator>
  <dc:date>2010-03-18T07:18:00+09:00</dc:date> 
 </item>
  <item rdf:about="http://www.cafeblo.com/programmer/entry-3ae550595f223aef42eb504699b357b4.html">
  <title>マクロの再定義の実験</title>
  <link>http://www.cafeblo.com/programmer/entry-3ae550595f223aef42eb504699b357b4.html</link>
  <description>マクロの再定義を実験してみた。

自分の環境では、
再定義可能のパターンではコンパイルがとおり、
再定義不可のパターンでは、warning: &quot;OBJ_LIKE&quot; redefined 等のワーニングが出た。

以下、プログラム。（表示都合上全角）

／＊
　　　　ｄｅｆｉｎｅ＿ｔｅｓｔ．ｃ
＊／
＃ｉｎｃｌｕｄｅ　＜ｓｔｄｉｏ．ｈ＞　　／＊　ｐｒｉｎｔｆ　＊／
＃ｉｎｃｌｕｄｅ　＜ｓｔｄｌｉｂ．ｈ＞　／＊　ＥＸＩＴ＿ＳＵＣＣＥＳＳ　＊／

＃ｄｅｆｉｎｅ　ＯＢＪ＿ＬＩＫＥ　（１−１）
＃ｄｅｆｉｎｅ　ＦＵＮＣ＿ＬＩＫＥ（ａ）　　　　（　ａ　）

ｉｎｔ　ｍａｉｎ（ｉｎｔ　ａｒｇｃ，　ｃｈａｒ　＊ａｒｇｖ［］）
｛
　　　　＃ｄｅｆｉｎｅ　ＯＢＪ＿ＬＩＫＥ　／＊　コメント　＊／　（１−１）　／＊　コメント　＊／
／／　　＃ｄｅｆｉｎｅ　ＯＢＪ＿ＬＩＫＥ　（０）　／／　字句の並びが違う
／／　　＃ｄｅｆｉｎｅ　ＯＢＪ＿ＬＩＫＥ　（１　−　１）　／／　空白類が違う

　　　　＃ｄｅｆｉｎｅ　ＦＵＮＣ＿ＬＩＫＥ（　ａ　）　（　／＊　空白類に注意　＊／　＼
　　　　　　　　　　　　　　　　　　　　　　　　　　　　ａ　／＊　一部が別の行
　　　　　　　　　　　　　　　　　　　　　　　　　　　　＊／　）
／／　　＃ｄｅｆｉｎｅ　ＦＵＮＣ＿ＬＩＫＥ（ａ）　　　　（　’ａ’　）　／／　仮引数の使用法が違う
／／　　＃ｄｅｆｉｎｅ　ＦＵＮＣ＿ＬＩＫＥ（ｂ）　　　　（　ｂ　）　／／　仮引数のつづりが違う

　　　　ｐｒｉｎｔｆ（”％ｄ＼ｎ”，　ＦＵＮＣ＿ＬＩＫＥ（ＯＢＪ＿ＬＩＫＥ））；

　　　　ｒｅｔｕｒｎ　ＥＸＩＴ＿ＳＵＣＣＥＳＳ；
｝
</description>
	<dc:creator>176454</dc:creator>
  <dc:date>2010-03-18T06:47:00+09:00</dc:date> 
 </item>
  <item rdf:about="http://www.cafeblo.com/programmer/entry-4d85852599622cde9996744fa51d1276.html">
  <title>マクロの再定義</title>
  <link>http://www.cafeblo.com/programmer/entry-4d85852599622cde9996744fa51d1276.html</link>
  <description>Ｃ言語の仕様（ＪＩＳＸ３０１０）によると、
オブジェクト形式マクロは条件付きで再定義できる、とある。

その条件は、
２番目の定義がオブジェクト形式マクロ定義であり、
かつ、２つの置換要素並びが同一、
とのこと。

また、関数形式マクロも条件付きで再定義可能だそう。

その条件は、
仮引数の個数とつづりが最初の定義と同一な関数形式マクロ定義、
かつ、２つの置換要素並びが同一。

置換要素並びとは、

＃ｄｅｆｉｎｅ　ＭＡＸ　１００

でいうと、１００と記されている部分のこと。

また「２つの置換要素並びは、その前処理字句列の個数、順序、
つづり及び空白類による区切り方が同じ場合、そしてその場合に限り、同一の並びとみなす。ただし、空白類による区切りは、いずれも同じものとみなす」とある。

そして、次のような例が挙げられている。

次の再定義は正しい。
＃ｄｅｆｉｎｅ　ＯＢＪ＿ＬＩＫＥ　　　　（１−１）
＃ｄｅｆｉｎｅ　ＯＢＪ＿ＬＩＫＥ　　　　／＊　空白類　＊／　（１−１）　／＊　その他　＊／
＃ｄｅｆｉｎｅ　ＦＵＮＣ＿ＬＩＫＥ（ａ）　　　　（　ａ　）
＃ｄｅｆｉｎｅ　ＦＵＮＣ＿ＬＩＫＥ（　ａ　）　（　／＊　空白類に注意　＊／　￥
　　　　　　　　　　　　　　　　　　　ａ　／＊　一部が別の行
　　　　　　　　　　　　　　　　　　　　　　＊／　）

次の再定義は正しくない。

＃ｄｅｆｉｎｅ　ＯＢＪ＿ＬＩＫＥ　　　　（０）　／／　字句の並びが違う
＃ｄｅｆｉｎｅ　ＯＢＪ＿ＬＩＫＥ　　　　（１　−　１）　／／　空白類が違う
＃ｄｅｆｉｎｅ　ＦＵＮＣ＿ＬＩＫＥ（ｂ）　　　　（　ａ　）　／／　仮引数の使用法が違う
＃ｄｅｆｉｎｅ　ＦＵＮＣ＿ＬＩＫＥ（ｂ）　　　　（　ｂ　）　／／　仮引数のつづりが違う
</description>
	<dc:creator>176454</dc:creator>
  <dc:date>2010-03-17T21:58:00+09:00</dc:date> 
 </item>
  <item rdf:about="http://www.cafeblo.com/programmer/entry-b8320c649e45924f6f8547ce575fb17c.html">
  <title>defineとは</title>
  <link>http://www.cafeblo.com/programmer/entry-b8320c649e45924f6f8547ce575fb17c.html</link>
  <description>Ｃ言語のｄｅｆｉｎｅについて調べてみた。
結果をまとめると以下のとおり。

ｄｅｆｉｎｅとは、プリプロセッサ指示のひとつで文字列を別の文字列に置き換えることができるもの。この機能はマクロ置換と呼ばれる。

使用例：
＃ｄｅｆｉｎｅ　ＭＡＸ　１００

この定義以降のプログラムでは、コンパイル時にプリプロセッサによりＭＡＸが１００と変換されてからコンパイルされる。
このようなマクロ置換をオブジェクト形式マクロと呼ぶ。

プリプロセッサとは、コンパイル前の準備的な処理を行うソフトウェアのことである。

マクロ置換は引数を取ることもできる。

使用例：
＃ｄｅｆｉｎｅ　ＲＮＤ（ｘ）　（ｒａｎｄ（）％（ｘ＋１））

このケースではＲＮＤ（９）は０〜９までの乱数となる。
このようなマクロ置換を関数形式マクロと呼ぶ。

関数形式マクロは、引数の型が固定されない、関数呼び出し時のオーバヘッドがない等、関数よりも便利な面がある。
反面、マクロ使用時のパラメータでインクリメントやデクリメントを行うと、それが複数回行われるケースがある等、不具合を発生させる危険もある。そのため、関数形式マクロの使用には注意が必要である。

参考ページ：C言語のdefineについて
</description>
	<dc:creator>176454</dc:creator>
  <dc:date>2010-03-17T21:02:00+09:00</dc:date> 
 </item>
</rdf:RDF>
