Tag: c ++ 11

编译器如何处理可变长度数组

这似乎是一个初学者的问题,但我对编译器通常创建变量维数组的方式感兴趣,就像在下面的程序中一样。 #include int main(){ int n; std::cin>>n; int a[n]; } 根据我所知,在C中,所有初始化值必须是常量,以便编译器知道在函数内保留多少内存,通常通过减去堆栈指针以容纳数组所包含的元素数量。 这对我来说很有意义。 但是,我不太明白编译器如何处理上述程序,因为它似乎与G ++(MinGW)一起工作,但是使用Cl,Microsoft的C ++编译器失败了。 我怀疑GCC通过非标准扩展在堆上分配内存,但我不确定。 此外,微软的编译器并不因标准兼容而闻名,所以如果它对待上述程序的方式实际上可能出错,我也不会感到惊讶。

在istream对象上扫描

注意:我看过post什么是scanf格式输入的cin analougus? 在提出问题之前,post并没有解决我的问题。 该post寻求C ++ – 这样做的方式,但正如我已经提到的那样,使用C ++是不方便的 – 有时这样做的方式我有明确的例子。 我试图从istream对象中读取数据,有时使用C ++风格的方法(例如operator >>)是不方便的,例如数据是特殊forms的123:456所以你必须灌输’:’as space(非常hacky,而不是%d:scanf中的%d),或00123,你想读取字符串并转换十进制而不是八进制(而不是scanf中的%d),以及可能的许多其他情况。 我选择istream作为接口的原因是因为它可以派生,因此更灵活。 例如,我们可以创建内存流,或者动态生成的一些自定义流等。另一方面,C风格的FILE *非常有限,至少在符合标准的方式下,创建自定义流。 所以我的问题是,有没有办法在istream对象上进行类似scanf的数据提取? 我认为fscanf内部使用fgetc从FILE *逐字符号读取,而istream也提供这样的接口。 因此可以通过复制和粘贴fscanf的代码并用istream对象替换FILE *来实现,但这非常hacky。 有没有更聪明,更清洁的方式,还是有一些现有的工作? 谢谢。