我必须用从 XML 文件获取的数组元素替换 400 个文字浮点数。
在不更改宏的情况下,您可以修复此代码以使用数组元素而不是文字,发布编码解决方案吗?
在 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.
在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++ 没有可变长度数组 (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
}
宏扩展代码:
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});
}