Microsoft C 编译器是否允许可变大小的数组?
Does Microsoft C compiler allow variable sized arrays?
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
但它没有帮助。还有其他解决方案吗?
p.s.
为什么我需要使用 Microsoft 编译器?因为我需要构建一个Windows Audio Processing Object(APO),而上面的代码是需要与APO链接的静态库的一部分。
Does Microsoft C compiler allow variable sized arrays?
没有。根据 Microsoft C - ANSI Conformance,他们的编译器符合 ANSI C 标准 9899:1990 版中规定的 C 语言标准。此版本不包含 VLA:s.
Is there a way to relax Microsoft C compiler permissiveness?
不是任性。 VLA:s 根本没有在他们的编译器中实现。
Any other solution?
要获得类似的行为(堆栈分配和在函数 returns 时自动释放内存),您可以使用已弃用的 _alloca 函数。
int function(const char *p)
{
const int str_size = strlen(p);
char* parameter = (char*) _alloca(str_size);
...
}
注意:如果space无法分配,则会产生堆栈溢出异常。堆栈溢出异常不是 C++ 异常;这是一个结构化异常。
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
但它没有帮助。还有其他解决方案吗?
p.s.
为什么我需要使用 Microsoft 编译器?因为我需要构建一个Windows Audio Processing Object(APO),而上面的代码是需要与APO链接的静态库的一部分。
Does Microsoft C compiler allow variable sized arrays?
没有。根据 Microsoft C - ANSI Conformance,他们的编译器符合 ANSI C 标准 9899:1990 版中规定的 C 语言标准。此版本不包含 VLA:s.
Is there a way to relax Microsoft C compiler permissiveness?
不是任性。 VLA:s 根本没有在他们的编译器中实现。
Any other solution?
要获得类似的行为(堆栈分配和在函数 returns 时自动释放内存),您可以使用已弃用的 _alloca 函数。
int function(const char *p)
{
const int str_size = strlen(p);
char* parameter = (char*) _alloca(str_size);
...
}
注意:如果space无法分配,则会产生堆栈溢出异常。堆栈溢出异常不是 C++ 异常;这是一个结构化异常。