初始化元素不是常量?
initializer element not constant?
我对 C 比较了解,只学习了它的一部分来发布一个 Pebble C/PebbleKitJS 应用程序来跟踪公共汽车。到目前为止,我已经在节点服务器上处理了数据,我正准备让 JS 文件处理数据。然而,我的一个问题在于 C 代码。
此代码处理存储在从 JS 发送的 Key Dictionary 中的数据,并将其分配给一个变量以供下面使用。通过使用 #define var 9,我可以成功地将 .high 值设置为 9。但是通过 int var,它失败并抛出 error:initializer element not constant? .
这个错误是什么意思,如果我不定义它,static 和 constant 之间到底有什么区别。显然静态变量没有 return 什么?一些帮助将不胜感激。
更新:问题仍未解决。除了初始值设定项之外,还会出现以下新错误消息。 error: (near initialization for 's_data_points[0].high')
int key0_buffer;
void process_tuple(Tuple *t)
{
//Get key
int key = t->key;
//Get integer value, if present
int value = t->value->int32;
//Get string value, if present
char string_value[32];
strcpy(string_value, t->value->cstring);
//Decide what to do
switch(key) {
case key_0:
//Location received
key0_buffer = value;
break;
}
}
static WeatherAppDataPoint s_data_points[] = {
{
.city = "San Diego",
.description = "surfboard :)",
.icon = WEATHER_APP_ICON_GENERIC_WEATHER,
.current = 110,
.high = key0_buffer,
.low = 9,
},
};
函数中的代码与下面定义静态变量的代码之间存在一个关键区别。函数代码是可执行的——当函数被调用时,这些行将得到 运行。
您对 WeatherAppDataPoint 的静态声明只是告诉编译器创建静态变量。您放置在该声明中的初始化值告诉编译器将此数据初始化为什么值。这就是它们必须保持不变的原因——这些是在执行任何操作之前加载的值。
#define 语句只是告诉预处理器将 "var" 的所有实例替换为字符串“9”。它实际上与文本编辑器中的剪切和粘贴操作相同。这是在编译器看到代码之前完成的。这就是为什么你对此没有问题;编译器看到的是一个文字常量,就像您直接在源代码中手动键入“9”一样。
在 'C' 中,变量不 return 东西,它们存储它们。仅功能 return 东西。如果你想在某处声明一个整数,然后将它分配给你的静态变量的值,那是一个实际的可执行代码行,需要在某个函数内部出现(即在你的 process_tuple功能)。静态声明下面的代码行不会在 运行 时间执行,它们只是设置程序的初始状态并告诉编译器变量有多大。
试试这个:
enum { key0_buffer = 9 };
C 在初始化全局变量时不提供运行时计算。 (这个概念确实作为一个名为 "dynamic initialization." 的 C++ 特性存在)
执行模型是将全局变量的所有字节存放在ROM中,然后将任何可修改的变量连同单个memcpy
复制到RAM中。将一个全局分配给另一个会更复杂。
#define
允许您替换文本 9
,这是一个常量表达式。
许多人不赞成使用文本替换来避免将变量视为原始的、不必要的低级并且可能效率低下。不过在这种情况下,结果应该是一样的。
在 C 中,enum
常量的类型为 int
,因此它们是合适的替代品。不过,你对其他类型不走运。
我对 C 比较了解,只学习了它的一部分来发布一个 Pebble C/PebbleKitJS 应用程序来跟踪公共汽车。到目前为止,我已经在节点服务器上处理了数据,我正准备让 JS 文件处理数据。然而,我的一个问题在于 C 代码。
此代码处理存储在从 JS 发送的 Key Dictionary 中的数据,并将其分配给一个变量以供下面使用。通过使用 #define var 9,我可以成功地将 .high 值设置为 9。但是通过 int var,它失败并抛出 error:initializer element not constant? .
这个错误是什么意思,如果我不定义它,static 和 constant 之间到底有什么区别。显然静态变量没有 return 什么?一些帮助将不胜感激。
更新:问题仍未解决。除了初始值设定项之外,还会出现以下新错误消息。 error: (near initialization for 's_data_points[0].high')
int key0_buffer;
void process_tuple(Tuple *t)
{
//Get key
int key = t->key;
//Get integer value, if present
int value = t->value->int32;
//Get string value, if present
char string_value[32];
strcpy(string_value, t->value->cstring);
//Decide what to do
switch(key) {
case key_0:
//Location received
key0_buffer = value;
break;
}
}
static WeatherAppDataPoint s_data_points[] = {
{
.city = "San Diego",
.description = "surfboard :)",
.icon = WEATHER_APP_ICON_GENERIC_WEATHER,
.current = 110,
.high = key0_buffer,
.low = 9,
},
};
函数中的代码与下面定义静态变量的代码之间存在一个关键区别。函数代码是可执行的——当函数被调用时,这些行将得到 运行。
您对 WeatherAppDataPoint 的静态声明只是告诉编译器创建静态变量。您放置在该声明中的初始化值告诉编译器将此数据初始化为什么值。这就是它们必须保持不变的原因——这些是在执行任何操作之前加载的值。
#define 语句只是告诉预处理器将 "var" 的所有实例替换为字符串“9”。它实际上与文本编辑器中的剪切和粘贴操作相同。这是在编译器看到代码之前完成的。这就是为什么你对此没有问题;编译器看到的是一个文字常量,就像您直接在源代码中手动键入“9”一样。
在 'C' 中,变量不 return 东西,它们存储它们。仅功能 return 东西。如果你想在某处声明一个整数,然后将它分配给你的静态变量的值,那是一个实际的可执行代码行,需要在某个函数内部出现(即在你的 process_tuple功能)。静态声明下面的代码行不会在 运行 时间执行,它们只是设置程序的初始状态并告诉编译器变量有多大。
试试这个:
enum { key0_buffer = 9 };
C 在初始化全局变量时不提供运行时计算。 (这个概念确实作为一个名为 "dynamic initialization." 的 C++ 特性存在)
执行模型是将全局变量的所有字节存放在ROM中,然后将任何可修改的变量连同单个
memcpy
复制到RAM中。将一个全局分配给另一个会更复杂。#define
允许您替换文本9
,这是一个常量表达式。许多人不赞成使用文本替换来避免将变量视为原始的、不必要的低级并且可能效率低下。不过在这种情况下,结果应该是一样的。
在 C 中,
enum
常量的类型为int
,因此它们是合适的替代品。不过,你对其他类型不走运。