为什么不能将函数分配给变量?

时间:2019-12-05 14:13:34

标签: c++ unsigned-char

如果我有以下代码示例:

#include <iostream>

using namespace std;


unsigned char Receive(void){
    unsigned char q[4] = {0x0B, 0x0B, 0x0B, 0x0B};
    return q;
}

void Transmit(){
    unsigned char a[4];
    a = Receive();
}

int main()
{
    Transmit();


    return 0;
}

那么当它们都为无符号字符时,为什么不能将Receive(void)的返回值分配给变量q?

编辑(请参阅下面的评论):

unsigned char Receive(void){
    array<unsigned char, 4> q{{0x0B, 0x0B, 0x0B, 0x0B}}
    return q;
}

void Transmit(){
    array<unsigned char, 4> a;
    a = Receive;
}

2 个答案:

答案 0 :(得分:1)

  

为什么不能将函数的[结果]分配给变量?

因为类型不匹配。该函数返回一个unsigned char,而变量的类型为unsigned char [4]。后者不可分配给前者。实际上,什么也不能分配给数组。

答案 1 :(得分:1)

您真的不想返回数组。返回数组会导致编译器制作该数组的副本(这会减慢速度)。

首选方法是传递一个指针:

unsigned char const *  Receive()
{
    static const unsigned char values[] = {0xf0, 0x0d};
    return &values[0];
}

这里的问题是未返回数组的容量。返回指向第一个元素的指针,仅此而已。

您可以传递一个数组,让编译器复制所有元素:

std::array<unsigned char, 4> Receive()
{
    std::array<unsigned char, 4> q{{0x0B, 0x0B, 0x0B, 0x0B}};
    return q;
}

另一种方法是通过引用传递std::vector

void Receive(std::vector<uint8_t>& container)
{
   container.push_back(0x08);
   container.push_back(0x0B);
   //...
}

void Function()
{
    std::vector<uint8_t> data;
    Receive(data);
    //...
}

通过引用传递消除了复制数据结构的需要。该函数直接修改调用方的变量。