【问题标题】:Error: Expression must have a constant value in keil错误:keil中的表达式必须有一个常量值
【发布时间】:2017-12-12 05:06:27
【问题描述】:

这是我的代码:

int i; char *p;
char mnc[20],mcc[20],network_string[20];
char *array_parse[3] = {mnc ,mcc ,network_string}; /* Error occurs here */
WATCH_DOG_RESET;
      printf("\n\n##############Mobile Country Code############\r\n");
      Modem_Send("AT*PSHPLMN?\r\n",13);
      ModemWaitForAtResponse((char *)APN_Buffer,80,20);
        p = strtok (APN_Buffer,"'\":");
        while (p!= NULL)
        {
                    strcpy(array_parse[i++], p);
          //printf ("%s\r\n",p);
          p = strtok (NULL, "\":");
        }
        printf("%s\r\n",mnc);
        printf("%s\r\n",mcc);
        printf("%s\r\n",network_string);

此代码在代码块中有效,但在 Keil uvision4 中无效。

我得到“表达式必须有一个常数值”。

【问题讨论】:

  • "表达式必须有一个常数值"
  • 是的,我使用了 c99 模式。但是生成的十六进制文件在我的微控制器中不起作用。但是我刚才没有使用c99模式就解决了这个问题。但是很好奇为什么没有c99模式会出现这个错误。
  • 它们是局部变量。而且代码很大。

标签: c keil


【解决方案1】:

据我了解,您在不编译为 C99 的情况下以某种方式纠正了您的问题。在 C99(因 1999 年批准而得名)之前,C89(因 1989 年批准而得名)要求您的初始化类型只使用常量表达式

让我们首先解释一下这个术语,常量表达式,因为它通常与 const 关键字混淆。 C89/3.4 Constant expressions 在这方面做得比我做得好得多,所以没有进一步的告别:

常量表达式可以在翻译期间而不是运行时进行计算,因此可以在常量可能存在的任何地方使用。

换句话说,如果编译器可以在不执行你的代码的情况下计算出结果,那么它就是一个常量表达式。

关于初始化,C89/3.5.7 表示:

具有静态存储持续时间的对象的初始化程序或具有聚合或联合类型的对象的初始化程序列表中的所有表达式都应为常量表达式。

关于聚合类型,在C89/3.1.2.5内,声明如下

数组和结构类型统称为聚合类型。


C99/6.7.8 Initialization 似乎是对该部分的全面改造,并且放宽了对聚合类型(例如您的数组)的要求。因此,使用现代 C99 或 C11 编译器进行编译肯定可以解决您的问题。

C11 与 C99 相比并没有改变太多东西。该标准化大多只是添加了一些小功能,如匿名联合、线程等,弃用了gets,并使 VLA 支持成为可选的......描述初始化的部分编号已更改; in C11 it's section 6.7.9, instead,这可能是因为我之前提到的添加内容。


请时不时地抽出一点空闲时间阅读标准。一天只要二十分钟。下次您使用您一直使用但您从未阅读过手册的功能时执行此操作。搜索函数,看看它是否在标准中,这样你就可以看到它是否可移植......了解它,它返回什么等等。你永远不知道 C 中的哪些细微差别可能会使你的代码从绝对垃圾变成光彩,并且除非您阅读它们,否则您不会知道其中的细微差别。

和平! C99ing 快乐!

【讨论】:

  • 具体来说,C99 中的相关变化是块范围(即函数内部)的初始化程序不需要是常量表达式
猜你喜欢
  • 1970-01-01
  • 2014-10-21
  • 2021-12-02
  • 2012-07-27
  • 1970-01-01
  • 1970-01-01
  • 2011-11-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多