为什么我不能在结构中初始化字符数组

Why I cannot initialize char array in struct

本文关键字:初始化 字符 数组 结构 不能 为什么      更新时间:2023-10-16

我尝试通过以下方式在结构声明中初始化字符数组。但它无法编译并显示错误消息。请让我知道为什么它无法编译。

#include <iostream>
struct A {
    const char value_in_struct[] = "a";  // this line gives me a error message.
};
void t(void) {
    const char value[] = "a";  // this line was ok at compiling
    std::cout << "value = " << value << std::endl;
}

我从 gcc 收到以下错误消息。

../static_constexpr_array.hpp:16:33: error: initializer-string for array of chars is too long [-fpermissive]
  const char value_in_struct[] = "a";
                                 ^

谢谢你为我利用时间。

问题是数组范围无法从类内初始值设定项自动推断出来。clang 生成的错误消息非常清楚(请参阅此处(:

prog.cc:4:34: error: array bound cannot be deduced from an in-class initializer
    const char value_in_struct[] = "a"; 
                                 ^

这是为什么呢?类内初始值设定项可由构造函数的成员初始值设定项列表重写。那么,如果构造函数选择用其他东西初始化数组怎么办?在您的情况下,可以使用大括号括起来的初始值设定项列表覆盖初始值设定项,如下所示(实际上是聚合初始化((请参阅此处(:

A a = {"abc"};

由于最终初始值设定项无法在编译时确定,因此编译器无法推断数组范围。

为数组提供显式范围会使代码编译(请参阅此处(。

#include <iostream>
struct A {
    const char value_in_struct[2] = "a";  
};
void t(void) {
    char value[] = "a";
    std::cout << "value = " << value << std::endl;
}
struct A {
    const char value_in_struct[] = "a";.
};

这是错误的。这是数组类成员还是对象成员?如果是类成员,则必须这样写:

static constexpr char value_in_struct[] = "a";

静态,因为它是类成员。Constexpr,因为你在类定义中初始化它。

如果它是对象成员,则无法在类定义中初始化它。

感谢您提出问题,当您陈述常量 char var[] = "某事"时;这意味着,您正在声明 char 类型数组的变量 var,其长度与初始化时分配给字符串的长度相同。例如。对于上述情况,其 10。

当您

可以初始化变量时,即当您在 main 或任何其他函数中声明它时,该语句将生效。

现在,代码的结构部分正在声明一个结构体 A,其中您在其中声明变量或常量字符 [],在这里您无法初始化它,因此出错。此外,如果您使用此类成员变量声明结构并尝试创建实例,它将给出编译错误,因为它的 const 类型,我们需要在创建实例时对其进行初始化,这是不可能的。

解决方法是在结构中将成员变量作为char *类型并相应地分配它,这样您将能够实现所需的目标。

我在同一行尝试了一些代码,并用行注释,它会给出编译错误..请参阅,希望对您有所帮助。

#include <iostream>
using namespace std;
struct B{
    const char mem_var[];
};
struct A {
    const char * value_in_struct ;  // this line gives me a error message.
    A(char *s):value_in_struct(s){}
    A() { value_in_struct = NULL;}
};
void t(void) {
    const char value[] = "att";  // this line was ok at compiling
    std::cout << "value = " << value << std::endl;
    //value[2] = 's';  // gives error
}
int main(){
    A a(const_cast< char *>("abc"));
    A b ;
    b.value_in_struct = "bbc";
    cout <<"a: "<<a.value_in_struct << endl;
    cout <<"b: "<<b.value_in_struct << endl;
    t();
    //B bb; gives error for not initizaling mem_var
    return 0;
}

自从我使用 c++ 以来已经有一段时间了,但我建议尝试一下:

const char[] value_in_strict = {'a'};