在将数组声明在main函数内部之前,需要先解决“数组边界不是整数常量”的问题。

4

程序1

#include <iostream>

std::size_t three() {
    return 3;
}

int i[three()];

int main() 
{
    return 0;
}

程序2

std::size_t three() {
    return 3;
}

int main() 
{
    int i[three()];
    return 0;
}

这里的问题是Program 1正如预期一样会出现编译错误,错误信息如下:"error: array bound is not an integer constant before ']' token"。但我不知道为什么程序2却能够成功编译?

1
尝试使用constexpr std::size_t three() { // ... - πάντα ῥεῖ
我知道我可以使用它,但我的问题是为什么程序2能够成功编译而程序1却不能。 - Abhishek Chandel
5
两者都不是有效的C++代码。无论你使用的是哪种语言扩展,它可能有一个规则来防止第一种情况发生。 - chris
我刚刚测试了两个版本,都无法在VS2010上编译通过... - Samer
@Samer 这是因为除了那些也属于 C++ 的特性之外,VS 的任何版本都不支持很多 C99 特性。如果在 gcc/clang 上启用 -Wall 和/或 -pedantic,OP 也会收到警告。 - Praetorian
显示剩余3条评论
1个回答

4
C99允许使用int i[three()];来声明变长数组,但只有在非静态或线程存储期上下文中才可以。在文件作用域中声明将使其具有静态存储期,因此即使在C99中也是不合法的。以你现在在main()中声明它的方式意味着它具有自动存储期,在C99中是允许的。
一些编译器,如GCC和Clang也支持在C89和C++模式下使用该语法,作为扩展功能。但就标准而言,这并不是合法的C++。如果您使用-pedantic编译,GCC和Clang都会对此代码产生警告。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接