1

私がただ入力できる代わりに

const clicks : Integer = 1;

入力する必要があります

{$J+}
const clicks : Integer = 1; 
{$J-}

コンパイラオプションメニューのチェックボックスをオンにするだけの方がはるかに簡単だと思います..しかし、長い間間違っていてもそれが私を傷つけないことを確認したかった..そして、なぜそれが無効になる(チェックされていない)のか疑問に思っていましたか?

これについて何か助けていただければ幸いです。ありがとうございます。

4

3 に答える 3

4

デフォルトでは、Delphi 2 がリリースされて以来、IIRC は無効になっています。実際のオプションは Delphi 1 のダイアログで提供されていましたが、次のバージョンでデフォルトが有効から無効に変更されたという騒ぎを思い出したようです。とはいえ、かなり時間が経っているので、デフォルトが逆になったときに 1 つオフになる可能性があります。D3だったかも。代入可能な定数は、古い Turbo Pascal 時代からの持ち越しであり、実際の静的変数型の欠如の代用です。これらは、初期化された (グローバル) 変数である、より優れたソリューションに置き換えられました (「 」を参照Declaring Variables)。

書き込み可能な定数を実際に使用する必要がある場合は、グローバル設定を変更するのではなく、必要な最小の (最も制限された) スコープでのみ使用する必要があります。定数は、可能な限り正確に (定数) する必要があります。書き込み可能な定数を使用する一般的な理由は、呼び出し間で値を保持する必要がある特定のスコープ (プロシージャ、関数、またはユニットなど) 内のローカル変数が必要な場合であり、通常はそれを行うためのより良い方法があります。一部のオプションは、オブジェクト フィールド (メンバー変数)、または範囲が限定された初期化変数 (implementationユニットのセクション内などの制限された領域で表示され、開始値に初期化される変数) です。

割り当て可能な定数は、実行時に値を変更できることを意味し、実際にはほとんど役に立ちません。真の定数とはまさにそれ (定数) であり、変更を許可するべきではありません。

型付き定数についても同じことが言えます。これらを使用する実際の必要性があるはずであり、これらの宣言のように、定数配列、レコード、ポインター、または手続き型を格納していない限り、ほとんどありません。

const
  TIntLookupArray: array[0..1] of Integer = (1, 2);
  TErrorMsgs: array[0..1] of string = ('Invalid input', 'Invalid sequence');

そもそも型付き定数を使用している理由はありますか? 使用するだけであれば、この問題は発生しません

const clicks = 1;

コンパイラに適切な型を決定させます。のサイズであることを確認したい場合は、次のIntegerような型キャストを使用してください

const clicks = Integer(1); 

詳細については、Delphi ドキュメントの docwikiを参照してください。

于 2013-05-30T18:52:20.067 に答える
3

割り当て可能な型付き定数オプションは、私が覚えている限り、デフォルトで無効になっています。Delphi 7 より前の多くのバージョンでは、デフォルトで無効になっていました。

言語機能は設計が不十分であり、そのため、私の見解では使用すべきではありません。コードの読者を混乱させます。定数を変更するという考えは、単純に奇妙です。割り当て可能な型付き定数の使用例は、静的 (つまり、グローバル) の保存期間を持つローカル スコープの変数です。

言語が適切に設計されていれば、静的な保存期間を持つローカル スコープの変数の場所ができます。しかし、Delphi 言語では const キーワードのオーバーロードが原因で、代入可能な型付き定数と実際の定数を簡単に区別できないため、この設計には致命的な欠陥がありました。

健全な設計では、静的ストレージを使用して変数を宣言し、それらを定数と区別する構文を導入していたでしょう。しかし、代わりに設計者はコンパイラ オプションを選択しました。あるいは、Turbo Pascal ではすべての型指定された定数が代入可能だった昔のことかもしれません。それでも、言語構文のサポートがなければ、 const キーワードのオーバーロードは単純に受け入れられません。

コンパイラ オプションは、下位互換性のために保持されています。割り当て可能な型付き定数を使用することは想定されていません。繰り返しになりますが、私が覚えている限り、適切なコーディング標準は割り当て可能な型付き定数の使用を禁止しています。

私の推奨事項:

  1. グローバル レベルで割り当て可能な型付き定数を無効にします。
  2. コードで $J+ を使用しないでください。

静的ストレージ期間を持つローカル スコープ変数の最新の Delphi で最も近い構造は、厳密なプライベート クラス変数です。これらは Delphi 7 では使用できないため、唯一のオプションはグローバル変数です。これは、かなり残念な状況です。

于 2013-05-30T18:54:14.320 に答える