我尝试通过以下方式初始化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;
}
谢谢你利用时间给我。
答案 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,因为你在类定义中初始化它。
如果是对象成员,则无法在类定义中对其进行初始化。