>>KAさんへ
初めに訳の分からない文章を読ませてしまった事をお詫びします。申し訳ありません。
あの理解不能な説明で言いたかった事とは、#define命令のヘルプ説明の中に、
>>『複数のプリプロセス文に展開されるようなマクロを
>>定義する用途などに使用することができます』
と書いてあるのに、実際には様々な条件を満たした極一部のプリプロセス分しか定義できない
というのは問題だろうという主張です。
まず#ifdef,#endif系統のコンパイル制御命令、#module,#global系統のモジュール命令、
#define,#undef系統のマクロ関連命令、#include,#addition系統のスクリプト接続命令、
#cmpopt,#packopt系統の実行時オプション指定命令、軽く調べただけでも標準プリプロセッサ
命令33種の内、実に19種のプリプロセッサ命令が#defineマクロの中に含める事のできないものと
なっています。(残り14種についても動作確認をしていないだけで、有用に動くのは#deffunc命令と
#defcfunc命令のみでしょう)
そして、その#deffunc命令にしてもヘルプに書かれていない様々な制約条件が与えられており
#defineマクロの中に組み込むには非常に面倒で技巧的な手法に頼らざるを得ないのです。
こう書かれるだけでは多分理解し辛いと思うので以下に実例を挙げます。
//1,引数を取る場合、マクロ展開時にstr,double,intを無効化しないといけない
私が一番最初にこのスレットに書いたソースを参考にしてください。『#undef str』を消すと
コンパイルの段階で弾かれます。最初のコメントでも言いました通り、#define内では自動的に
str等が標準マクロとして読み込まれるようなのです。
それでも、問題点がこれだけであれば一応サンプルもあるので何とか利用する事はできます。
しかし以下に示す第2の問題点により、そのサンプル自体が使えなくなってしまうのです。
//2,モジュール中では#define⇒#deffunc構文(=サンプル)すら使えなくなる(以下は具体例)
//モジュール内でmesset(#define〜#deffunc構文)を定義した場合
#module XXX
#define messet(%1,%2) %c #deffunc %1 %c mes %2 : return
messet mes_module,"[モジュール内]"
#global
//グローバル空間でmessetを定義した場合
#define messet(%1,%2) %c #deffunc %1 %c mes %2 : return
goto *@f
messet mes_global,"[グローバル空間]"
messet mes_global2,"[ぐろおばるくうかん]"
*@
//グローバル空間のmessetで定義した命令は普通に働くものの、
//モジュール内のmessetで定義した命令はプリプロセッサ段階で弾かれる
//(そもそも#deffunc命令なのにグローバル空間との命令重複が無視されている)
mes_global : mes_global2
;mes_module
『;mes_module』をコメント状態から解除してやると、即座にコンパイル段階で弾かれます。
コンパイル後のソースを見れば少しだけですが原因が分かってきます。
#module xxx
goto@hsp *_xxx_exit
##22
#deffunc@xxx mes_module@xxx
mes@hsp "[モジュール内]" : return@hsp
##25
#global
*_xxx_exit
##25
goto@hsp *@f
#deffunc mes_global
mes@hsp "[グローバル空間]" : return@hsp
##31
#deffunc mes_global2
mes@hsp "[ぐろおばるくうかん]" : return@hsp
##32
*@
mes_global : mes_global2
このソースを見て分かる通り、モジュール中の#defineはマクロを置き換える際に、丁重な
事にモジュール名を添え字として付けるようなのです。そして、添え字をされた#deffunc命令は
真っ当なプリプロセッサ命令として認識されず、結果モジュール中では#define⇒#deffunc構文が
使用不能になるのです。
最後に結論を言えば、この現状が仕様でも何でも良いので、まるで#defineならプリプロセッサ
命令の置き換えもできると読めるようなヘルプの内容を次回辺りのマイナーチェンジで修正して
ほしいのです。
特にあのサンプルはモジュールに放り込んだ瞬間に無力化する代物なので、最低限の注意書きは
書い添えておいてほしいと思うのです。
本題は以上ですが、この件を調べている内に仕様なのかバグなのか分からない不思議な現象に
ついて書いておきます。
#module
//このコメント部分を開放するとpythagorasが使えなくなる
; #undef int
; #define int int@hsp
#deffunc pythagoras int a,int b
mes a*a+b*b
return
#global
pythagoras 3,4
>>testさんへ
確かに『全ての命令が対応していない』とは書かれていましたが、実際は33種中2種+αしか
利用できないというのは問題だと思います。
モジュール中の挙動やパラメータタイプの異常もありますし、ある程度の自由度があるかの
ように読み取れるヘルプの書き方は使い手を惑わせるだけだと思います。