ISO C標準では、複数のシンボルに同じ置換シーケンスを割り当てる前処理ディレクティブは記述されていません。私。この種のものは、標準では存在しません:
// fantasy syntax:
#definemulti (A B C) replacement token sequence
交換配列は複数のトークンを含めることができるので、そこに持っているいずれかの名前が終わるところどこかに括弧、または伝えるために他の方法でなければならないと考え置換シーケンス。
28年のCコーディングでは、このような拡張子を持つコンパイラを必要とする場所ではコードの断片が見られませんでした。拡張子を持つコンパイラを見つけたとしても、それを使用する際の移植性はほとんどありません価値がある。
これを言語に導入すると、わずかなタイピングしか保存できないため、おそらく障害に直面するでしょう。
さらに、私たちはこれが誤ったものであるということを、テクニカル引数にすることができます。
は、私たちがコードの動作を調整するためのいくつかのコンパイル時のパラメータ— A
、B
、およびC
—を持っていると言います。彼らは同じ値を持っているので、私たちはそれらを1行で定義します。
後で同じ値を持たない場合は、異なる値を別々の#define
構成に分割するようにプログラムを編集する必要があります。例えば、このから:
#definemulti (A B C) 1
この
#definemulti (A C) 1
#define B 2
これはA
とC
をタッチライン差分をもたらします。 B
が移行されたため、definemulti
行全体が新しい行に置き換えられます。
@@ -x, y +z, w @@
...
-#define (A B C) 1
+#define (A C) 1
+#define B 2
...
一方、最初の場所で、私たちは持っている、とします:
#define A 1
#define B 1
#define C 1
差分塊は、このような、よりよいです:
GNUスタイルのコンテキストdiffの下で、変更は、次のようになります一見
@@ -x, y +z, w @@
...
#define A 1
-#define B 1
+#define B 2
#define C 1
...
、我々はA
とC
が影響を受けていることがわかり、そしてB
は2
に変更しています。
また、割り当て式がの理由も考えてください。大きな理由の1つは、val
が1回だけ評価されることです。 a = b = c
は、評価順序の変更やc
の複数評価のため、常にa = c, b = c
と書き換えられるとは限りません。
Cプリプロセッサには変数がありません –
'#define'はマクロを定義します。それらは変数ではありません。定数の場合は、 'static const int VAR1 = 1;'などを使用するほうがよい場合がよくあります。型の安全性を高めますが、最適化コンパイラは同様に優れたコードを生成できるはずです。 – hyde
あなたの2番目のソリューションは妥当性があります。あなたの問題は何ですか? –