【问题标题】:Does Microsoft C compiler allow variable sized arrays?Microsoft C 编译器是否允许可变大小的数组?
【发布时间】:2021-04-06 21:32:58
【问题描述】:
int function(const char *p)
{
    const int str_size = strlen(p);
    char parameter[str_size];
    ...
}

上面使用Microsoft Visual Studio 2019 C编译器编译的代码报错:

Error E0028 expression must have a constant value

Error C2057 expected constant expression

Error C2466 cannot allocate an array of constant size 0

Error C2133 'parameter': unknown size

我已经成功地使用 GCC 和 Clang 编译了相同的代码。

有没有办法放宽 Microsoft C 编译器的许可?我试过/permissive 但这没有帮助。还有其他解决方案吗?

附言
为什么我需要使用微软编译器?因为我需要构建一个WindowsAudio Processing Object(APO),而上面的代码是需要与APO链接的静态库的一部分。

【问题讨论】:

  • 不,MSVC 不支持 VLA。
  • @Danijel 据我所知,MS VS C++/C 不支持可变长度数组。如果您将程序编译为 C++ 程序,请使用 std::vector。
  • 您已经标记了[c][c++]。它们是不同的语言。您应该在此处详细说明您打算使用哪一个。
  • From devblogs at MS ,总之不要屏住呼吸;它不存在,也无意存在。
  • @AndrewHenle 他们花了 永远 来支持 stdint.hinttypes.h。在过去 5 年多的时间里,他们对 C 合规性的兴趣实际上变得更好,尽管从字面上所有其他工具链的任何衡量标准来看,他们仍在以蜗牛的速度前进。这本身就是一个指标,表明它在如此长的一段时间内腐烂得有多严重。

标签: c visual-studio gcc clang


【解决方案1】:

Microsoft C 编译器是否允许可变大小的数组?

没有。根据Microsoft C - ANSI Conformance,他们的编译器符合 ANSI C 标准 9899:1990 版中规定的 C 语言标准。此版本不包括 VLA:s。

有没有办法放宽 Microsoft C 编译器的许可?

这与宽容无关。 VLA:s 根本没有在他们的编译器中实现。

还有其他解决方案吗?

要获得类似的行为(堆栈分配和在函数返回时自动释放内存),您可以使用已弃用的 _alloca 函数。

int function(const char *p)
{
    const int str_size = strlen(p);
    char* parameter = (char*) _alloca(str_size);
    ...
}

注意:如果无法分配空间,则会产生堆栈溢出异常。堆栈溢出异常不是 C++ 异常;这是一个结构化异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-30
    • 1970-01-01
    相关资源
    最近更新 更多