Constに対する要望:Cの#defineと同様にできませんか?

返信する


答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: Constに対する要望:Cの#defineと同様にできませんか?

by 山本 » 2005年6月04日(土) 11:53

ご報告ありがとうございます。
詳細は、バグ報告の板に書きましたので、ご覧下さい。

バグかもしれません

by Sinryow » 2005年6月04日(土) 10:06

どうやら,ただのConstのバグのような気が・・・。

最初実験した時は,こんなコードを使っていました。

コード: 全て選択

#N88BASIC
Dim u As Long
u=255
Print RGB(0, 0, u)
これだと「"RGB(0,0,u)" 無効な識別子です」となるので今回の質問をしたわけです。ところが

コード: 全て選択

#N88BASIC
Dim u As Long
u=255
Print (RGB(0, 0, u))
とすると,正常に動作しました。
また,実際に描画のプログラムを作ってみたときも正常に動作しました。

by 山本 » 2005年6月02日(木) 01:02

確かに、#define、#ifdefはあったほうがいいですね。開発スケジュールを調整して、時間ができ次第、検討していこうと思います。

Constで定義するマクロ関数についてですが、以下の2種類の演算方法をとっています。

・Constステートメントの右辺値、Dimステートメントの配列要素 … コンパイルの段階で演算が行われる。
・変数への代入演算、または関数パラメータ … マクロ関数の演算内容が機械語レベルでインライン展開される。演算が行われるのは実行時。

by Sinryow » 2005年6月01日(水) 00:23

なるほど,inlineですか。
単に「Function Inline RGB(r As Long, g As Long, b As Long) As Long」のようにできるようにしてもいいかもしれませんね。

by イグトランス » 2005年5月31日(火) 18:09

> > #defineの導入よりも既に登録済みキーワードでコンパイラを制御できる
> > #ifdefとかがほしいですね。
>
> そうですね。条件付きコンパイルが可能になれば開発工程での柔軟性も増しますし。
> 僕の場合、デバッグ時専用コードを条件付きコンパイルで埋め込んだりするので、#ifdefがあるのなら#defineは必須となります。

私はその場合も#defineは#ifdef/#ifndef専用にしてマクロ置き換えには使えないようにする方が良いと思います。

それに現在、C++やそれよりもさらに後に作られた言語では#~の類は廃止しようとする方向へ進んでいるようです。
(const定数やinline/template関数などへ)

高速化なんてのもABのコンパイラがConst関数を機械語レベルでインライン展開するように改良すれば済むのではないでしょうか。
(もちろんそう簡単に出来ることではないのはわかっていますが)

by tak » 2005年5月31日(火) 16:12

> 型を指定できるとありがたいです。

マクロ関数とは、コンパイル時に、関数が定義した式に置き換えられるアレですよね。
ということは、関数とは名ばかりで、どちらかというと式に近い物だと思います。
ABでは式に型を持たせる、C言語でいうところの型キャストのような機構がないので、無理だと思います。


> #defineの導入よりも既に登録済みキーワードでコンパイラを制御できる
> #ifdefとかがほしいですね。

そうですね。条件付きコンパイルが可能になれば開発工程での柔軟性も増しますし。
僕の場合、デバッグ時専用コードを条件付きコンパイルで埋め込んだりするので、#ifdefがあるのなら#defineは必須となります。

by NoWest » 2005年5月31日(火) 14:58

> Const定義の右辺値やDim定義の配列要素指定を除けば、RGBなどのマクロ関数(Const定義されたもの)であっても、パラメータに変数を渡すことはできます。

Const RGB(r As Byte, g As Byte, b As Byte)
型を指定できるとありがたいです。

> #includeと同様、#defineの導入も考えたことがあるんですが、万が一、#defineを多重したプログラムが作成されたとすると、エラーの突き止めが難しくなるという意見がありました。そこで、演算にのみ特化したステートメントとしてConstを取り入れたというワケです。
> 個人的には#defineを多用してエラー個所がわからなくなってしまったことはあまりないので、必要であれば、、、という感じです…。

#defineの導入よりも既に登録済みキーワードでコンパイラを制御できる
#ifdefとかがほしいですね。
API定義ファイルを作っていて「定義済みです。」というエラーを見るのは結構辛いです。

by 山本 » 2005年5月31日(火) 11:34

Const定義の右辺値やDim定義の配列要素指定を除けば、RGBなどのマクロ関数(Const定義されたもの)であっても、パラメータに変数を渡すことはできます。

http://www.discoversoft.net/help_center ... /Const.htm
「マクロ関数の呼び出しは通常の関数呼び出しと同様に行うことができます。arglistで指定する引数がすべてリテラル値または定数値の場合に限り、そのマクロ関数を定数の代入値expressionとして利用することができます。」
言語仕様はこのようになっています。

#N88BASIC
Dim a As Long
Dim b As Long
Dim c As Long

b=&H12
c=&H34
a=RGB(&H56,c,b)
Print Hex$(a)


#includeと同様、#defineの導入も考えたことがあるんですが、万が一、#defineを多重したプログラムが作成されたとすると、エラーの突き止めが難しくなるという意見がありました。そこで、演算にのみ特化したステートメントとしてConstを取り入れたというワケです。
個人的には#defineを多用してエラー個所がわからなくなってしまったことはあまりないので、必要であれば、、、という感じです…。

Constに対する要望:Cの#defineと同様にできませんか?

by Sinryow » 2005年5月31日(火) 09:42

Constによる定数・関数宣言の扱いを,Cの#defineと同様(すなわち,コードが当該部分に埋め込まれた状態になる)にできないでしょうか?

RGB関数とかで変数を引数に取れないのは辛いです。

それにそうしておけばConstの幅が広がりますし,また高速化にも役立てることができそうですし。

ページトップ