C 初始值设定项元素不是常量?

C 初始值设定项元素不是常量?,c,pebble-sdk,C,Pebble Sdk,我对C比较了解,只是学习了发布一个Pebble C/Pebble KitJS应用程序来跟踪公交车的部分内容。到目前为止,我已经在一个节点服务器上处理了数据,我已经准备好让JS文件处理这些数据。然而,我的一个问题在于C代码 这段代码处理存储在JS发送的密钥字典中的数据,并将其分配给下面使用的变量。通过使用#define var 9,我可以成功地将.high值设置为9。但是通过int变量,它失败并抛出错误:initializer元素不是常量 这个错误意味着什么?如果我不定义它,静态和常量之间的区别到

我对C比较了解,只是学习了发布一个Pebble C/Pebble KitJS应用程序来跟踪公交车的部分内容。到目前为止,我已经在一个节点服务器上处理了数据,我已经准备好让JS文件处理这些数据。然而,我的一个问题在于C代码

这段代码处理存储在JS发送的密钥字典中的数据,并将其分配给下面使用的变量。通过使用#define var 9,我可以成功地将.high值设置为9。但是通过int变量,它失败并抛出错误:initializer元素不是常量

这个错误意味着什么?如果我不定义它,静态和常量之间的区别到底是什么。显然静态变量不返回任何东西?如果能帮上点忙,我将不胜感激

更新:问题仍未解决。除了初始值设定项之外,还会出现以下新错误消息<代码>错误:(接近's_data_points[0]的初始化高度)

   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语句只是告诉预处理器用字符串“9”替换“var”的所有实例。它与文本编辑器中的剪切和粘贴操作完全相同。这是在编译器看到代码之前完成的。这就是为什么你没有问题;编译器会看到一个文本常量,就像您直接在源代码中手动键入“9”一样

在“C”中,变量不返回东西,而是存储它们。只有函数返回东西。如果您想在某个地方声明一个整数,然后将它赋给静态变量的值,那么这是一行实际的可执行代码,需要出现在函数的某个地方(即在您的process\u tuple函数内部)。静态声明下面的代码行不是在运行时执行的,它们只是设置程序的初始状态,并告诉编译器变量有多大。

请尝试以下操作:

enum { key0_buffer = 9 };
  • C在初始化全局变量时不提供运行时计算。(这个概念确实作为一个C++特性存在,称为“动态初始化”。 执行模型是,它可以将全局变量的所有字节存储在ROM中,然后使用单个
    memcpy
    将任何可修改的变量复制到RAM中。将一个全局变量分配给另一个全局变量将更加复杂

  • #define
    允许您替换文本
    9
    ,这是一个常量表达式

    许多人不赞成使用文本替换来避免变量过于原始、不必要的低级和潜在的低效。但在这种情况下,结果应该是相同的

  • 在C中,
    enum
    常量的类型为
    int
    ,因此它们是合适的替代品。不过,对于其他类型的人来说,你运气不好


如果
s\u数据\u点
是本地的,是否允许使用初始值设定项?(有一段时间没用C了…@JesseGood这有点离题了。我记得C89中不允许这样做,但我不确定现代版本是否允许这样做。问题已经在使用一些C99功能。-啊,现在检查了C11,它说“对于具有静态或线程存储持续时间的对象,初始值设定项中的所有表达式都应该是常量表达式或字符串文字”,所以我想现在可以了。啊,对
指定的初始值设定项
是C99特性。我在C90中发现答案
,数组的初始化无效,因为函数调用不是常量表达式。C99取消了对具有自动存储持续时间的对象的此限制,并允许在此类对象的括号内初始值设定项中使用任何运行时表达式。具有静态存储持续时间的对象,无论其类型如何,都必须在C99中用常量表达式初始化。
。所以是的,如果它是本地的,它是被允许的。@Potatostater谢谢你的帮助。来自rubyonrails、Python和Javascript的const和static等C概念对我来说都是新概念。接受有趣的是,我差点就自己修好了,但我把
int-const
const-int
搞混了。