2016-11-06 6 views
2

2つのCプリプロセッサマクロに同じ値を同時に割り当てることはできますか?同じコマンドで2つのCプリプロセッサ変数を割り当てる

a = b = 1; 

私はあなたがこれを行うことができます知っている:それは、この通常のCコードに似て振る舞う

#define VAR1 1 
#define VAR2 1 

をしかし、それ、今混乱物事へのコードの複製、よりチャンスがありますという理由だけで、痛みのビットアップ。これは唯一の解決策ですか?

#define VAR1 1 
#define VAR2 VAR1 

EDIT:様々なコメントが指摘したように、プリプロセッサは、マクロではなく、変数を持っています。申し訳ありません。

+10

Cプリプロセッサには変数がありません –

+1

'#define'はマクロを定義します。それらは変数ではありません。定数の場合は、 'static const int VAR1 = 1;'などを使用するほうがよい場合がよくあります。型の安全性を高めますが、最適化コンパイラは同様に優れたコードを生成できるはずです。 – hyde

+1

あなたの2番目のソリューションは妥当性があります。あなたの問題は何ですか? –

答えて

2

ISO C標準では、複数のシンボルに同じ置換シーケンスを割り当てる前処理ディレクティブは記述されていません。私。この種のものは、標準では存在しません:

// fantasy syntax: 
#definemulti (A B C) replacement token sequence 

交換配列は複数のトークンを含めることができるので、そこに持っているいずれかの名前が終わるところどこかに括弧、または伝えるために他の方法でなければならないと考え置換シーケンス。

28年のCコーディングでは、このような拡張子を持つコンパイラを必要とする場所ではコードの断片が見られませんでした。拡張子を持つコンパイラを見つけたとしても、それを使用する際の移植性はほとんどありません価値がある。

これを言語に導入すると、わずかなタイピングしか保存できないため、おそらく障害に直面するでしょう。

さらに、私たちはこれが誤ったものであるということを、テクニカル引数にすることができます。

は、私たちがコードの動作を調整するためのいくつかのコンパイル時のパラメータ— AB、およびC —を持っていると言います。彼らは同じ値を持っているので、私たちはそれらを1行で定義します。

後で同じ値を持たない場合は、異なる値を別々の#define構成に分割するようにプログラムを編集する必要があります。例えば、このから:

#definemulti (A B C) 1 

この

#definemulti (A C) 1 
#define B 2 

これはACをタッチライン差分をもたらします。 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 
... 

、我々はACが影響を受けていることがわかり、そしてB2に変更しています。

また、割り当て式がの理由も考えてください。大きな理由の1つは、valが1回だけ評価されることです。 a = b = cは、評価順序の変更やcの複数評価のため、常にa = c, b = cと書き換えられるとは限りません。

0

preprocessor syntaxを見ると、両方のマクロを一緒に設定する標準的な方法はないようです。この構文では、1つのトークンのみを1つ以上の置換トークンに変更することができ、演算子連鎖のようなことは許されません。

プリプロセッサディレクティブは改行で終わらなければならないので、同じ行に2つのディレクティブを置くこともできません。プリプロセッサが実行される前に改行文字を挿入するためのdigraphs or trigraphsもありません(以前の多くのSO答えで確認されています)。

0

私が推測することができるのは、2つのビルド構成マクロが必要なようですが、通常は同じ値にする必要があります。あなたはVAR2設定として定義することにした場合

一つの解決策は、今、あなたの最後のコードに

#define VAR1 1   /* May be from a configuration file or makefile. */ 

/* In the proper source: */ 
#ifndef VAR2   /* If some configuration is still missing, */ 
# define VAR2 VAR1 /* fill in the blank. */ 
#endif 

を少し詳しく説明するだろう、それはifndef内のデフォルトの設定を解除します。

関連する問題