考虑以下代码,该代码尝试在堆栈上分配包含可变长度数组的对象。
#include <stdio.h>
struct ContainVarLen {
int normal;
int varlen[];
};
int main(){
ContainVarLen c;
}
假设我在编译时知道我需要varlen
对象中的8字节数据。
是否有语法指定我想要额外的8字节分配?
我认为在对象之前声明一个字节数组似乎是一个黑客。
答案 0 :(得分:6)
template <std::size_t NBytes>
class ContainVarLen
{
int normal;
int varlen[NBytes / sizeof(int)];
};
现在使用任何constexpr实例化:
constexpr long fib(const int x)
{
return x <= 1 ? 1 : fib(x - 1) + fib(x - 2);
}
int main()
{
ContainVarLen<fib(7)> c;
...
}
答案 1 :(得分:0)
没有标准的可移植C ++语法。
某些编译器可能会提供自己的非标准扩展,有时可用于可移植性不是因素。
例如,使用gcc我会做这样的事情:
struct ContainVarLen {
int normal;
int *varlen;
};
int foo(size_t n) {
int varlen_buf[n];
ContainVarLen c;
c.varlen=varlen_buf;
}
另一种可能的想法是将alloca(3)与展示位置一起使用。