C++ 我应该用什么代替#define

标签 c++ expression constants

我想使用 cin 运算符从控制台给出一个值,而不是使用 #define N 6。 我试过了,但收到“表达式必须具有常量值”的错误消息。 反之我该怎么办?

感谢您的回答!

示例代码:

#include <iostream>
#include <string>
#include <cstdlib> 
#include <ctime>
#define N 6
using namespace std;

typedef struct person {
    int roll;
    string name;
} Person;

int main() {
    int numberofperson;
    cout << "Number of people: "; cin >> numberofperson;
    srand(time(NULL));
    Person people[N];
    int i;
    for (i = 0; i < numberofperson; i++)    {
        cout << "Write the " << i + 1 << ". name of the person: ";
        cin  >> people[i].name;
        people[i].roll = rand() % 6 + 1;
        cout << "Roll with dice: " << people[i].roll<<endl;
    }

    return 0;
}

最佳答案

定义是用预处理器展开的。事实上,#define N 6 意味着代码中所有出现的 N 都将被替换为 6,从而替换 cin >> Ncin >> 6

解决方案是让N成为一个变量:

int N;
cin >> N;
// do whatever you want with N

但是,请注意,在这种情况下 Person people[N] 是一个可变大小的数组(也就是说,它的大小在编译期间是未知的。它是非标准的 C++,你应该避免它。考虑使用 vector 代替——它基本上是标准库中的可变大小数组。

cin >> N;
vector<Person> people(N);
...
cin >> people[i].name;

关于C++ 我应该用什么代替#define,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50308585/

相关文章:

c++ - 用新的函数声明语法覆盖

c - 表达式必须是可修改的值 (C)

php - 表达式中的变量赋值如何工作?

c++ - const * const 的预处理器简写

c++ - 具有共享所有者语义的容器

c++ - 2系高效电源 : (2^n) + (2^(n-1)) + (2^(n-2))

c++ - 如何创建每个进程都可以访问的同步互斥体?

c - 是P1DIR |= (BIT0 | BIT6); P1DIR |= BIT0 + BIT6;相同的表达?

c++ - const boost::array<T,N> 还是 boost::array<const T,N>?

PHP 常量未定义 - 但它们已定义!