如何在从用户输入后在函数中使用常量值

时间:2017-09-14 15:46:16

标签: c++ visual-c++ functional-programming visual-studio-macros

所以这里我有一部分代码,我在其中定义宏以将标识符MIN_BIT设置为基于用户输入的值:

#define MIN_BITS(n) 1*n
int MIN_BIT = MIN_BITS(n);

然后我在主函数中接受用户输入'n'的值。

现在,我有一个函数来获取LSB,将它排列在一个数组中,并以相反的顺序打印数组,因此MSB在左边:

void print_binary( unsigned number )
{
    unsigned bits [ MIN_BIT ] ; // <-- error here
    int count = 0 ;
    while( number>0 || count < MIN_BIT )
    {
        bits [count] = number % 2;
        number >>= 1;
        count++;
    }
    for( int i = count -1; i >=0; i--)
        cout << bits[i];
}

但是,在上面代码中标记为1的行上,我收到错误“表达式必须具有常量值”。变量MIN_BIT的值不能用作常量。

请为此问题建议解决方法,或以不同方式实现此方法。

1 个答案:

答案 0 :(得分:1)

请改为尝试:

#define MIN_BITS(t) (sizeof(t) * 8)

或者,如果您需要支持字节大小不是8位的系统,请使用CHAR_BIT

#define MIN_BITS(t) (sizeof(t) * CHAR_BIT)

然后,你可以这样做:

void print_binary( unsigned number )
{
    const int num_bits = MIN_BITS(number);

    unsigned bits [ num_bits ];
    int count;

    for(count = 0; (number != 0) && (count < num_bits); ++count)
    {
        bits[count] = number & 1;
        number >>= 1;
    }

    for(int i = count-1; i >= 0; --i)
        cout << bits[i];
}

Live demo

您不能使用在运行时确定的值来定义静态固定长度数组(称为可变长度数组,这是非标准的,只有少数编译器将其实现为额外功能)。如果您需要,请改为使用std::vector

#include <vector>

void print_binary( unsigned number )
{
    std::vector<unsigned> bits;
    bits.reserve(n);

    for(int i = 0; (number != 0) && (i < n); ++i)
    {
        bits.push_back(number & 1);
        number >>= 1;
    }

    for(int i = bits.size()-1; i >= 0; --i)
        cout << bits[i];
}

否则,只需将数组定义为输入变量可以物理保存的最大位数,然后使用用户输入的值来限制可以存储在数组中的值的数量:

#define MAX_BITS(t) (sizeof(t) * CHAR_BIT)

void print_binary( unsigned number )
{
    const int max_bits = MAX_BITS(number);

    unsigned bits [ max_bits ];
    int count;

    for(count = 0; (number != 0) && (count < n) && (count < max_bits); ++count)
    {
        bits[count] = number & 1;
        number >>= 1;
    }

    for(int i = count-1; i >= 0; --i)
        cout << bits[i];
}