为什么编译错误
why compilation error
#include<iostream>
using namespace std;
const int a[]={1,2,3,4,5};
int b[a[2]];
int main(){return 0;}
为什么此代码会出现编译错误。有人可以简要,简洁和确切地解释行为吗?
我正在使用 gcc 4.6
tt.cc:5:11: error: array bound is not an integer constant before ']' token
我发现错误消息非常解释。您不能声明
int b[a[2]];
你应该使用
int b[3];
而且您很可能想改用std::vector
。
C++11个技巧
您可以使用 C++11 编译器(如刚刚发布的 GCC 4.7(编译代码,方法是声明
constexpr int a[]={1,2,3,4,5};
但这对我来说似乎很疯狂。您确实想使用向量或其他容器类型。
对于 C++03:
8.3.4.1 数组声明为:
D1[constant-expression]
在这种情况下,constant-expression
是一个整数常量表达式。
如果我们看一下 5.19.1,我们会发现什么是整数常量表达式:
- 文字
-
const
变量 - 使用常量表达式初始化的整型或枚举类型的静态数据成员
- 整型或枚举类型的非类型模板参数
-
sizeof
表达式 - 浮动文本(如果强制转换为整型或枚举类型(
特别是,除sizeof
外,不能使用以下:
- 功能
- 类对象
- 指针或引用
- 赋值、递增、递减、函数调用或逗号运算符
在您的情况下,a[2]
两者都不是,因此它不能用作数组的长度。
对于C++11:
大致相同,只是您可以将a
声明为constexpr
并将其用作数组的长度。但是,这种编码风格通常很糟糕,除非你评估了所有其他选项,否则你不应该写这样的东西。
编辑:
我不明白为什么这个问题被否决了。我觉得很有趣:
1(您实际上可以在C++11中执行此操作,constexpr
2(即使在C++03中,行为至少是奇怪的(如果你不搜索标准(:
const int x = 2;
const int a[]={1,2,3,4,5};
int c[x]; //compiles
int b[a[2]]; //doesn't
国际 b[a[2]];
您需要提供编译时可用的数组大小(即固定大小的数组(,或使用malloc
等动态分配。
相关文章:
- 用MacOS Mojave编译C++:致命错误:mpi.h:没有这样的文件或目录
- std::is_base_of表示ctor编译错误
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- Qt5:使用QCommandLineParser类时出现奇怪的编译错误
- Qt Cmake 错误编译"GuiSupportQt not found"
- Opengl 精度转换错误编译错误 E0415
- 库将ARM架构错误编译为架构X64
- RT 音频 Mac 错误 g++ 编译错误
- 错误编译Boost.log
- 错误编译QT创建者 / QT窗口小部件示例
- 错误编译MIPS32
- Visual Studio 2013 中的错误(编译和运行代码)
- 链接错误编译qt项目在visual 2010
- 无法用模板错误编译nsgmls
- 奇怪的错误.编译失败
- 如果有人调用c++中的方法,则强制错误(编译时)
- 来自autoconf测试的错误编译命令
- 时间限制超出错误C++编译
- SFML 2.3 和 CodeBlocks 错误编译