为什么我不能在struct中初始化char数组

时间:2016-01-30 14:43:36

标签: c++ arrays compiler-errors char

我尝试通过以下方式初始化struct声明中的char数组。但它无法使用错误消息进行编译。 请告诉我为什么无法编译。

var win = Ti.UI.createWindow();

var data = [];

for(var i=1; i<=6; i++){

    var view = Ti.UI.createView({
        width : 320,
        top : 10,
        bottom : 0
    });



    var button = Ti.UI.createButton({
        bottom : 10,
        left : 10,
        right : 10,
        height : 40,
        color : '#fff',
        backgroundColor : 'red',
        title : "click",
        ids: i
    });


    view.add(button);


    button.addEventListener('click', function(e) {
        Ti.API.info('button: ' + e.source.ids);
    });


    data.push(view);

}

var scroll_view = Ti.UI.createScrollableView({
    showPagingControl : true,
    top : 130,
    views: data,
    layout: 'horizontal'
});



win.add(scroll_view);

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

#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;
}

谢谢你利用时间给我。

4 个答案:

答案 0 :(得分:4)

问题是无法从类内初始值设定项中自动推导出数组范围。 clang产生的错误信息非常清楚(参见here):

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

那为什么呢?可以通过构造函数的成员初始值设定项列表覆盖类内初始值设定项。那么,如果构造函数选择用其他东西初始化数组呢?在您的情况下,初始化程序可以用括号括起的初始化程序列表覆盖,如下所示(实际上是聚合初始化)(参见here):

A a = {"abc"};

由于最终初始化程序无法在编译时确定,编译器无法推断出数组范围。

使数组具有显式范围使代码编译(参见here)。

#include <iostream>

struct A {
    const char value_in_struct[2] = "a";  
};

void t(void) {
    char value[] = "a";
    std::cout << "value = " << value << std::endl;
}

答案 1 :(得分:1)

感谢您提问,当您声明const char var [] =“something”; 这意味着,您声明了char类型数组的变量var,其长度与初始化时分配给字符串的长度相同。例如。以上情况为10。

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

现在你的struct部分代码声明了一个struct A,你在其中声明变量或const char [],在这里你不能初始化它,因此错误。此外,如果你使用这样的成员变量声明struct并尝试创建实例,它将因为const类型而给出编译错误,我们需要在创建实例时初始化它,这是不可能的。

解决方法是在struct中将成员变量作为类型char *并相应地分配它,这样你就可以实现你想要的东西。

我在相同的行上尝试了一些代码并用行注释它会产生编译错误..请看,希望它有所帮助。

y

答案 2 :(得分:0)

自从我使用c ++以来已经有一段时间了,但我可以推荐尝试:

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

答案 3 :(得分:-1)

struct A {
    const char value_in_struct[] = "a";.
};

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

static constexpr char value_in_struct[] = "a";

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

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