用作函数参数时将默认值设置为 C 数组

Set default value to C array when used as function argument

我有以下功能:

void getDefaultMaterial(Uint8 rgb[3]);

问题是我希望 rgb 参数具有默认值。像那样:

void getDefaultMaterial(Uint8 rgb[3]={255, 255, 255});

不幸的是,编译器不喜欢这样?还有别的办法吗?

您可能不需要数组,因为它会衰减为函数参数中的指针。您可以简单地将其声明为指针并将其默认设置为 nullptr 或您喜欢的任何内容,并在函数中确定默认地址。

例如:

void getDefaultMaterial(Uint8 *rgb = nullptr) {
    static Uint8 defaultArg[3] = {255, 255, 255};
    if (rgb == nullptr) {
        rgb = defaultArg;
        // Reset them if you need
    }
    // Your stuff
}

注意参数是指针,不是数组
对于编译器,原型相当于

void getDefaultMaterial(Uint8* rgb);

重载是一种选择:

void getDefaultMaterial(Uint8 rgb[3]);

void getDefaultMaterial()
{
    Uint8 rgb[3] = { 255, 255, 255 };
    getDefaultMaterial(rgb);
}

虽然,如果 rgb 是一个 "out" 参数,我不明白这一点。

如果不是"out"参数,你可以使用具有默认值的实际数组,但你需要通过常量引用传递它:

void getDefaultMaterial(const Uint8 (&rgb)[3] = {255, 255, 255});

或者,作为 "out" 参数与 "default by overloading":

void getDefaultMaterial(Uint8 (&rgb)[3]);

void getDefaultMaterial()
{
    Uint8 rgb[3] = { 255, 255, 255 };
    getDefaultMaterial(rgb);
}

你的 "array" 是一个指针,而不是数组。使用实际的数组(只能通过引用传递)可以正常工作。

void fun (const int (&a)[3] = {1,2,3}) {
    std::cout << a[1];
}

当然,真正正确的方法是使用std::array,它没有所有这些限制。

或者使用 std::array 包装器作为参数:

void getDefaultMaterial(std::array<Uint8, 3> rgb = { { 255, 255, 255 } });

这将允许您使用 braced-init-list 作为默认参数值。请注意,只有 C++11 标准才需要 double 大括号。在 C++14 及更高版本的标准中,您可以省略它们:

void getDefaultMaterial(std::array<Uint8, 3> rgb = { 255, 255, 255 });