ランダム変数名、それは可能ですか?

何らかの理由で複数の変数を作成し、配列を使用せずし、別の名前を持つ必要がある場合を考えてみましょう。論理的には、空の変数を作成せず、必要に応じて500を設定します。

つまり、配列やベクトルをランダムに使用することなく、同じ名前の変数を生成することは可能ですか?

可能であれば、インスタンス化ロジックまたはCまたはC ++が必要です。

私はこのメソッド(C)で試してみましたが動作しません:

#include //for random

#define RANDOM random(100)

int main ( void )
{
    int n/**/RANDOM = 5;
    return 0;
}

おそらく古いコンパイラは、コメントを削除するので動作します。現在のコンパイラはコメントをスペースとみなします。

3
私はそれが純粋な好奇心からはずれると思いますが、そうでない場合は、その名前がランダムであればどのように変数を使用しますか?
追加された 著者 Paul Manta,
@Davidには、誰にでも興味がある質問だけがここに掲載されるというポリシーがありますか?あなたにとって興味深いものがないからといって、それは皆にとって興味深いわけではありません。次回に投票する前に投票してください。
追加された 著者 MK.,
@DavidHeffernanまあ、その後、 "あまりにもローカライズされた"という意味を読んでいますか?
追加された 著者 MK.,
ランダムな名前の変数にはどうやってアクセスしますか? :)
追加された 著者 BЈовић,
@mk私はそれが何を意味するのか知っています。私が間違っていると、他の人が再投票することができます。
追加された 著者 David Heffernan,
@MK私は、質問が「あまりにも局在化した」閉鎖の理由と一致したと判断した。
追加された 著者 David Heffernan,
さて、私の投票は、それが価値あるものであるかどうかを「あまりにも局在化した」ものでした。本当の十分な疑問のように思えますが、誰にも興味がありません。
追加された 著者 David Heffernan,
私は尋ねる必要があります、なぜあなたはそのようなことをする必要がありますか?それは私には意味をなさない。
追加された 著者 netcoder,
これは、別の言語をC言語にコンパイルする場合に便利です。
追加された 著者 mike jones,
むしろ好奇心です。そして私は彼女の名前を配列に保存するようになった。それを使うロジックはあまりありませんが、それは単に好奇心です。
追加された 著者 Bruno Alano,

4 答え

少なくとも最近のGCCでは、

 #define NEWVAR_NUM(Var,Num) { static int Var_##Num; foo(&Var_##Num); }
 #define NEWVAR(Var) NEWVAR_NUM(Var,__COUNTER__)

On other (or with standard conforming) compilers, you can use __LINE__ instead of __COUNTER__. See Common Predefined Macros of GCC and cpp's concatenation

また、そのような考案されたCコードを生成することも考えられます。 m4 または独自のジェネレーター(10行のスクリプトまたは100Kラインジェネレーター)を使用することができます。

6
追加された
gcc 4.8.5では動作しませんが、カウンタは決して展開しません。
追加された 著者 Valentin Heinitz,
+1、非常に有用な情報
追加された 著者 az4dan,

次のようなことを試すことができます:

#define CONCAT_INTERNAL(a, b) a ## b
#define CONCAT(a, b) CONCAT_INTERNAL(a, b)

int CONCAT(var, __LINE__);
int CONCAT(var, __LINE__);
int CONCAT(var, __LINE__);

そうでなければ __ LINE __ が評価される前にトークン var__ LINE __ が連結されるので、 CONCAT_INTERNAL

このプリプロセッサトリックは広く使用されています。 NetBSD にあります。

6
追加された
私は複数の評価を避けるためにこれを使用しています: #define SQUARE(x)int CONCAT(__ tmp_、__LINE__)=(x)、tmp * tmp (気にしない、これはひどく失敗する)。
追加された 著者 new123456,
まったくの狂気のためにupvote。
追加された 著者 MK.,
gcc 4.8.5の LINEは展開しません。エラーは次のとおりです。/ home/valentinheinitz/Workspaces/hitrax3/trunk/sinogrambuffe‌ r/src/sinogrambuffer‌/sinogrambufferLib/s‌ inogramBuffer.cc:29:エラー: 'int var__LINE__'の再定義int CONCAT(var、 LINE ); ^
追加された 著者 Valentin Heinitz,
静的インラインint sqr(int x){return x * x; }
追加された 著者 Roland Illig,
@ValentinHeinitz私はそれを再現し、コードを修正しました。このような明白なバグを見つけるのに5年以上かかることは奇妙です。
追加された 著者 Roland Illig,

プログラムのライフサイクルは次のとおりです。

  1. ソースコードが前処理されている
  2. ソースコードがコンパイルされている
  3. 結果のバイナリが実行されます

randomへの呼び出しは、実行段階でのみ発生します。 あなたは前処理段階でそれをしようとしています。期間、動作しません。

あなたの質問に関して - それはちょうど意味がなく、あなたが達成しようとしていることは何かを説明してください。

5
追加された
質問はおそらく誤って表現されていましたが、理にかなっています。ランダムは「ユニーク」または「偽造が困難」を意味し、
追加された 著者 Basile Starynkevitch,

First of all, you can't do that using a function from because those are run-time; what you need is a compile-time construct.

このようなことをする唯一の方法は、プリプロセッサを使うことですが、C/C ++のプリプロセッサは非常に基本的なものです。インクリメントする変数はなく、乱数を生成する関数はありません。

0
追加された