【问题标题】:Is int arr[ ] valid C++?int arr[ ] 是有效的 C++ 吗?
【发布时间】:2022-01-08 10:02:02
【问题描述】:

我试图了解编写 int arr[]; 在 C++ 中是否有效。举个例子,

int a[]; //is this valid?
extern int b[];//is this valid?

int (*ptrB)[]; //is this valid?
struct Name
{
    int k[]; //is this valid?
};
void func()
{
    ptrB++; //is this valid?
}
int a[10];
int b[10];
void bar()
{
    ptrB = &b;//is this valid?
    ptrB++; //is this valid?
}
int main()
{
    int c[];//is this valid?
    extern int d[]; //is this valid?
}

int c[10];
int d[10];

我在 SO 上阅读了一些 cmets,指出 int p[]; 不是有效的 C++。所以我想知道这在什么情况下有效/无效。为此我写了上面的 sn-p 并想通过这个例子来理解。

【问题讨论】:

  • “我已经阅读了一些关于 SO 的 cmets 声明 int p[]; 不是有效的 C++。”:这些很可能是专门参考 int p[] 作为类的数据成员.这在 C 中被允许作为 struct 的最后一个成员,并在那里称为 灵活数组成员,但在 C++ 中是不允许的。一些编译器允许它在 C++ 模式下作为扩展(如果不使用严格的一致性标志)。

标签: c++ arrays c++11 incomplete-type


【解决方案1】:

让我们看看每个案例。

案例一

这里有声明

int a[]; //this is a definition so size must be known

这是无效

案例 2

这里有声明:

extern int b[];//this is a declaration that is not a definition

这是有效。这里b 的类型是incomplete。此外,b 具有外部链接

案例 3

我们有:

int (*ptrB)[]; 

这是有效。我们说ptrB 是一个指向不完整类型的指针

案例4

我们有:

struct Name
{
    int k[]; //NOT VALID
};

无效来自cppreference

以下任何上下文都要求类型 T 是完整的:

  • 声明一个 T 类型的非静态类数据成员

案例 5

我们有:

void func()
{
    ptrB++; //NOT VALID
}

无效来自postfix increment's documentation

内置后缀递增或递减运算符的操作数 expr 必须是非布尔(C++17 起)算术类型的可修改(非常量)左值或指向完全定义的指针 对象类型。

案例 6

我们有:

void bar()
{
    ptrB = &b;//NOT VALID
}

无效来自cppreference

数组对象的声明类型可能是一个未知边界的数组,因此在翻译单元中的某一点是不完整的,稍后会完成;这两个点的数组类型(“T 的未知边界数组”和“N T 的数组”)是不同的类型

案例 7

我们有:

void bar()
{
    ptrB++; //NOT VALID

无效来自cppreferene

指向未知边界数组的指针的类型,或指向由 typedef 声明定义为未知边界数组的类型,无法完成

所以我们会得到与案例 5 相同的错误。

案例 8

我们有:

int main()
{
    int c[]; 
}

这是无效,因为这是一个定义,所以尺寸必须是已知的

案例 9

我们有:

int main()
{
    extern int d[]; non-defining declaration
}

这是有效d 具有外部链接

【讨论】:

  • 但是 case 4 是有效的 C 吗? stackoverflow.com/a/26183999/17635987
  • @kirjosieppo 在您发布的链接中,写着 “作为一种特殊情况,具有 多个 命名成员的结构的最后一个元素可能有不完整的数组类型..." 。所以我不能 100% 确定案例 4 在C 中是否有效,因为它只有一个成员,并且在引文中写着“不止一个”。根据上面引用的语句,我认为案例 4 在 C 中是无效的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-06
  • 2011-02-20
  • 2021-09-16
  • 2010-11-18
  • 2011-07-26
  • 1970-01-01
相关资源
最近更新 更多