【问题标题】:Is it possible to build variable name at runtime in C++? [duplicate]是否可以在 C++ 中在运行时构建变量名? [复制]
【发布时间】:2018-05-31 21:03:30
【问题描述】:

我有以有序方式命名的变量,i1、i2、i3……我试图在运行时使用变量名称的数字部分访问这些变量。

以下是我尝试用于解决此问题的代码。它不能正常工作。

#include <iostream>
using namespace std;

#define CreateVariable(c,v) c##v

int main()
{
    int i1(11), i2(22), i3(33), i4(44), i5(55);
    cout << CreateVariable(i, 3) << endl;   // This is working and prints "33"

    int k;
    cin >> k;                           // suppose user input '5'
    if (k > 0 && k < 6)
        cout << CreateVariable(i, k) << endl;  // This is not working

    return 0;
}

是否有可能在 C++ 中实现?

【问题讨论】:

  • 不,你不能。 #define 甚至在编译之前就被处理了。但是你也许可以在使用关联数组后得到你想要的实用程序。
  • 预处理器指令甚至在你的编译器看到你的代码之前就被评估了。
  • 第二个例子扩展为cout &lt;&lt; ik &lt;&lt; endl。如果k 的值为0,它不会扩展到i0。无论如何,不​​要使用宏,而是考虑使用数组(或在 C++ 中,标准库中的容器之一)并按索引访问元素。

标签: c++ preprocessor


【解决方案1】:

不,这是不可能的。但是,您可以将这些变量/值放入数组(或映射)中并通过索引访问它们。

【讨论】:

    【解决方案2】:

    预处理器在编译器之前完成它的工作。 所以#define 可以在编译前用作宏。 但是,在 C++ 中无法以这种方式在运行时进行评估。

    您可以改用 STL 容器,例如 std::vectorstd::array

    例如:

    #include <iostream>
    #include <vector>
    using namespace std;
    
    int main()
    {
        std::vector<int> vec {11,22,33,44,55,66};
    
        int k;
        cin >> k;                           // suppose user input '5'
        if (k > 0 && k < 6)
            cout << vec[k] << endl; 
    
        return 0;
    }
    

    【讨论】:

    • "// This is not working"。过时的评论。
    猜你喜欢
    • 1970-01-01
    • 2011-04-27
    • 2023-04-07
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-04
    相关资源
    最近更新 更多