随机变量名称,这可能吗?

时间:2011-11-12 22:02:09

标签: c++ c variables random

想象一下,如果出于任何原因,您想创建多个变量,而不使用数组,并且必须具有不同的名称。从逻辑上讲,您不会创建空变量,只能根据需要设置500。

简而言之,可以在不随机使用数组或向量的情况下生成具有相同名称的变量吗?

如果可能的话,我想要实例化逻辑或C或C ++。

我尝试过这种方法(在C中),但不起作用:

#include <stdlib.h> // for random

#define RANDOM random(100)

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

可能是较旧的编译器工作,因为他们删除了评论。当前的编译器将注释视为空格。

4 个答案:

答案 0 :(得分:6)

至少在最近的GCC上,你可以使用像

这样的技巧
 #define NEWVAR_NUM(Var,Num) { static int Var_##Num; foo(&Var_##Num); }
 #define NEWVAR(Var) NEWVAR_NUM(Var,__COUNTER__)

在其他(或使用标准符合)编译器上,您可以使用__LINE__代替__COUNTER__。请参阅GCC的Common Predefined Macros和cpp的concatenation

另外,您可以考虑生成这样的设计C代码,例如: m4或您自己的生成器(可以是十行脚本或100K行生成器)。

答案 1 :(得分:6)

您可以尝试这样的事情:

#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__);

通过CONCAT_INTERNAL间接是必要的,因为否则在评估var之前会将标记__LINE____LINE__连接在一起。

这种预处理器技巧被广泛使用,例如在NetBSD

答案 2 :(得分:5)

您的计划的生命周期是:

  1. 源代码已预处理
  2. 源代码已编译
  3. 生成二进制文件
  4. 随机调用只能在执行阶段发生。 您正在尝试在预处理阶段执行此操作。期间不行。

    关于你的问题 - 这没有任何意义,解释你想要实现的目标。

答案 3 :(得分:0)

首先,你不能使用<stdlib.h>中的函数来执行此操作,因为它们是运行时的;你需要的是一个编译时构造。

执行此类操作的唯一方法是使用预处理器,但C / C ++的预处理器非常基本。它没有可能增加的变量,它当然没有生成随机数的函数。