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


HSPTV!掲示板


未解決 解決 停止 削除要請

2019
0123
吹雪#undefの仕様6解決


吹雪

リンク

2019/1/23(Wed) 00:48:07|NO.86373

#undefまたは新規の命令にて、#funcや#deffuncなどで登録したキーワードを無効にできるようにならないでしょうか?

今回、hspinetを使っているのですがurlencodeに容量制限があったので自作したところ、キーワードの重複で登録できませんでした。

このようなケース以外でも、モジュールのバージョンアップによる予約語の増加時などにも活用できるかと思います。



この記事に返信する


名無し

リンク

2019/1/23(Wed) 04:45:06|NO.86374

#deffunc より下に書けばできるみたいですよ.
例えば,次のスクリプトではエラーが出て実行できません.

#module #deffunc Test Return #undef Test #global Test



吹雪

リンク

2019/1/26(Sat) 01:26:28|NO.86395

確かに、上記スクリプトは動きますね。



#include "hspinet.as" #undef urlencode urlencode



吹雪

リンク

2019/1/26(Sat) 01:27:38|NO.86396

確かに、上記スクリプトは動きますね。



#include "hspinet.as" #undef urlencode urlencode

というスクリプトは正しく#undef去れていません。

#includeとの実行順序の問題などなにかあるのでしょうか?



玄冬

リンク

2019/1/26(Sat) 10:22:41|NO.86399

urlencodeが#deffuncによるマクロではなく#funcだからでは?



吹雪

リンク

2019/1/27(Sun) 21:21:52|NO.86410

公式リファレンスには以下のように同じような説明があるので、どちらかだけでできるというのは少しおかしいのではないかと思うわけなのです。

そのうち改善されるとよいのですが…


-------------------------------------------------------------

#func

外部DLL呼び出し命令登録
外部DLLを呼び出すための新しい命令を登録します。
(後略)



#deffunc

新規命令を登録する
ユーザーによる新規命令を登録します。
(後略)



掘木

リンク

2019/1/30(Wed) 20:50:12|NO.86439

そもそもどちらもできないんですよね。

一見うまくいくように見えるのはコードの最適化によって、コンパイラが#deffuncをスキップしている。
#funcはundefがグローバル領域に居るのが問題なのか最適化を壊してコンパイルが通りません。

どちらにせよ、プリプロセスとコンパイラの2度読み検証の際に最適化が掛かる影響で希望のような動作をしているだけで、
どちらも最適化が効かない状況になると重複定義、予約済み語の使用としてエラーになります。

詳しくは過去ログにて。


で、そのような改変の可能性はと言うと#funcに関しては行けそうにも見える。
ただ、#deffuncに関しては後方宣言が認められるため、無効化する範囲を明言する構文が必要。
(そもそも正常に打ち消せもしない#undefの宣言が通ること自体が問題なんですがねー。)



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