可变大小的对象可能无法初始化? (不改变宏)

问题描述 投票:0回答:2

我必须用从 XML 文件获取的数组元素替换 400 个文字浮点数。

在不更改宏的情况下,您可以修复此代码以使用数组元素而不是文字,发布编码解决方案吗?

  1. https://cpp.sh/ 上,我使用以下代码收到以下编译器错误。

    #define SET_THING(guest, toy, size, thing)\
    double toy[size] = thing
    
    int main ()
    {
      int i2[2];
    
      i2[0] = 2;
    
      SET_THING(guest,name, i2[0], {1.9});
    }
    
    main.cpp:10:25: error: variable-sized object may not be initialized
      SET_THING(guest,name, i2[0], {1.9});
                            ^~~~~
    main.cpp:2:12: note: expanded from macro 'SET_THING'
    double toy[size] = thing
               ^~~~
    1 error generated.
    
  2. https://cpp.sh/上,我没有收到以下代码的编译器错误:

    #define SET_THING(guest, toy, size, thing)\
    double toy[size] = thing
    
    int main ()
    {
      int i2[2];
    
      i2[0] = 2;
    
      SET_THING(guest,name, 2, {1.9});
    }
    

我尝试向宏发送非数组变量,但没有成功。

c++ macros
2个回答
0
投票

标准 C++ 没有可变长度数组 (VLA)。在do支持VLA作为扩展的C++实现中,您可能仍然无法初始化这些VLA。

但是,您可以将其改为

std::vector<double>
,所有符合标准的实现都支持它。

#include <iostream>
#include <vector>

#define SET_THING(guest, toy, size, thing) \
    std::vector<double> toy thing;         \
    toy.resize(size)

int main() {
    int i2[2];

    i2[0] = 2;

    SET_THING(guest, name, i2[0], {1.9});

    std::cout << name.size() << '\n' // 2
              << name[0] << '\n';    // 1.9
}

注意:尚不清楚

guest
的用途。我建议删除它。


宏的替代方案可能如下所示:

template<double... Ds>
std::vector<double> set_thing(std::size_t size) {
    std::vector<double> rv{Ds...};
    rv.resize(size);
    return rv;
}

int main() {
    int i2[2];

    i2[0] = 2;

    auto name = set_thing<1.9>(i2[0]);

    std::cout << name.size() << '\n' // 2
              << name[0] << '\n';    // 1.9
}

0
投票

为什么这个VLA(可变长度数组)定义不可靠?

宏扩展代码:

int main ()
{
  int i2[2];

  i2[0] = 2;

  double name[i2[0]] = {1.9};
}

i2[0]
是运行时值,因此
name
是VLA,请参阅上面的文章。您可以使用
constexpr

#define SET_THING(guest, toy, size, thing)\
double toy[size] = thing

int main ()
{
  constexpr int i2[2]{2};

  SET_THING(guest,name, i2[0], {1.9});
}
© www.soinside.com 2019 - 2024. All rights reserved.