HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2019
1105
アキアキノヒロロプリプロセッサとコンパイルについて6解決


アキアキノヒロロ

リンク

2019/11/5(Tue) 12:40:32|NO.88810

 別スレッド「エディタのバージョン違いを知らせるメッセージの表示は?」をたてたものです。
その方法について、色々ご教示いただきましたが、今回の表題について、どうもスッキリとしません。
 ググっていると、

 「C# ではプリプロセス命令の解釈をコンパイルと同時に行っている」

『 C# によるプログラミング入門 [その他]プリプロセス 』
https://ufcpp.net/study/csharp/sp_preprocess.html

という解説を見つけました。本来、プリプロセッサ命令でプログラムの実行範囲からはずした
部分は、コンパイルしなくていいはずなのに、同時に行っているため、はずした部分であっても、
そこに「文法エラー」があると、コンパイル不可能で止まってしまう。そのため、実行範囲と
した部分まで、たとえそこに「文法エラー」がなくても、結局、実行されなくなってしまう。
「HSP」も、この「C#」の場合と同じように考えていいのでしょうか。

 「C言語やC++言語では本当に文字通り、 コンパイルの前に命令の解釈を行っていた」

ともありました。この順番にやってくれればいいのに、と思いますが、何故そうしなくなった
のでしょう。コンパイル出力のON/OFFと言いながら、その判断のために、スクリプトを進める
のと一緒に、コンパイルも進めているというのは、効率を上げるためだけのように思います。
その辺が曖昧で、私のような知識の乏しいものには、コンパイル出力をはずしているところまで、
何故、エラー判定を持ち込まれるのか、わからなかったのです。
 どなたか、もう少し、わかりやすく説明していただけないでしょうか。



この記事に返信する


沢渡

リンク

2019/11/5(Tue) 21:36:59|NO.88811

C系のことはよく知りませんが、少なくとも以下のような実験をした限り、
HSPでは「プリプロセッサ命令は通常命令よりも先に解釈される」という風に私は判断しました。

#define a //←コメントアウトするとエラーになる goto *x #ifdef a *x #endif



アキアキノヒロロ

リンク

2019/11/6(Wed) 00:48:40|NO.88812

 「HSPでは「プリプロセッサ命令は通常命令よりも先に解釈される」という風に私は判断しました。」

私は「HSP」しか触れたことがないのですが、私も、そのように理解しています。

 「コンパイルの前に命令の解釈を行っていた」というのは、
 「コンパイルの前にプリプロセッサ命令の解釈を行っていた」

という意味でしょう。うまく説明できていませんでした。
 ちょっとしつこい言い方になるかも知れないことをお許しいただければ、次のようになります。

 プリプロセッサ命令でコンパイル出力をONにするのかOFFにするのか、それはどこからどこまでの
範囲のことを指しているのか、それらのことを読み取るために、一行目からあたっていき、こうして
プリプロセッサ命令を拾いあげ終わった後に、それらのプリプロセッサ命令の指示に従って、
コンパイル出力のON/OFFをする。コンパイル出力のONになる範囲をコンパイルし、コンパイル出力の
OFFになる範囲はコンパイルしない。そして、実際に実行されるのは、当然、そのコンパイルされた
範囲だけ。だとすれば、「文法エラー」がある場合、その箇所をコンパイルの範囲からはずすよう、
プリプロセッサ命令をしたなら、「文法エラー」のないその他の範囲はコンパイルされ、スクリプトは
実行されるはず。
 ところが、「C言語やC++言語では本当に文字通り、 コンパイルの前に命令の解釈を行っていた」
というように、文字通りそうだったが、
「C# ではプリプロセス命令の解釈をコンパイルと同時に行っている」ため、「文法エラー」があれば、
そこをプリプロセス命令で範囲外にするようにしても、コンパイルに失敗してしまう。これでは、何の
ための、プリプロセッサ命令なのか、意味がわからないじゃあないか、ということなんです。
 自分が前にたてたスレッドで、どうもスッキリしなかったのは、「HSP」も、この「C#」の場合と
同じようになっているからではないか、ということなんです。



アキアキノヒロロ

リンク

2019/11/6(Wed) 08:24:27|NO.88813

 前に立てたスレッドと突き合わせて、もう少し付け加えさせてもらうなら、MillkeyStars さんが
[NO.88720]や[NO.88739]で言っているように、「HSP」に

 「プリプロセッサ命令時点でコンパイル停止させて(メッセージを表示させる機構が)欲しい」

ということ、言いかえれば、

 「プリプロセッサ命令の解釈を全て済ませてから、その指示するところだけコンパイルして、
 そのコンパイルしたところだけ実行するようにして欲しい」

ということです。何か、同じことを繰返し言っているようで、すいません。



ooo

リンク

2019/11/6(Wed) 19:29:59|NO.88814

いろいろ勘違いしているようですが、hspではプリプロセスが終わった後にコンパイルをしています。
プリプロセスではずれた部分はコンパイルされませんのでその部分でコンパイルエラーは起きません。
コンパイルエラーが起きるのは、プリプロセスではずれていないからです。

ついでに言うとスクリプトの先頭に
#cmpopt ppout 1

と入れるとプリプロセス結果がhsptmp.iというファイルで出力されるのでそれをエディタで開い見てみるといいです。 



MillkeyStars

リンク

2019/11/6(Wed) 20:53:39|NO.88815

今回の問題は、プリプロセッサは正常だけど、コードジェネレーターでエラーを出しちゃうから、実行自体が不可能ってことね。
dialog はスクリプトが実行されないと意味を成さないわけで。

コードジェネレーター側で、未定義の命令がある時点でエラーを出しちゃうから、プリプロセッサ命令の条件出力で出力したとしても、スクリプト自体が実行されないと意味がない。

【スクリプト】

#if __hspver__ < $3601 dialog "このスクリプトは、HSP バージョン 3.6β1 以降が必要です。" end #endif gpspr var,bufid,celid,gmode stop
【エラー画面】

#HSP script preprocessor ver3.6beta1 / onion software 1997-2019(c) #Use file [hspdef.as] #HSP code generator ver3.6beta1 / onion software 1997-2019(c) ???(6) : error 2 : 文法が間違っています (6行目) --> gpspr var,bufid,celid,gmode@hsp
開発側としては、利用者全員が仕様書・説明書を読んでいただけるなら問題は発生しないと思うけど、100% 保障がないですしね。



アキアキノヒロロ

リンク

2019/11/7(Thu) 09:49:00|NO.88817

 この掲示板を利用されている方々に不愉快な思いを抱かせてしまったのでは、と心配します。
申し訳ありません。
 思い込んだことを正当化しようとする気持ちばかりで、冷静に学んでいく姿勢を失っていました。

 ooo さん、それに気づかせて頂きました。ありがとうございます。
 MillkeyStars さん、MillkeyStars さんの言っている本来の意味を私の都合のいいように、解釈して
利用してしまったようで、すいませんでした。

 まだまだ、未熟です。勉強です。

 ありがとうございました。



ONION software Copyright 1997-2023(c) All rights reserved.