这是我的代码:
newkanji
此代码适用于代码块,但不适用于Keil uvision4。
我得到"表达式必须具有恒定的值"。
答案 0 :(得分: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!