初始化元素不是常量?

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,因此它们是合适的替代品。不过,你对其他类型不走运。