“初始化器元素不是常量”错误,在Linux GCC中没有任何原因,编译C

“初始化器元素不是常量”错误,在Linux GCC中没有任何原因,编译C,第1张

概述这个问题在这里已经有一个答案:            >             Error “initializer element is not constant” when trying to initialize variable with const                                    4个 我使用我的main.c文件,并在Mac OS X中使用gcc 这个问题在这里已经有一个答案:> Error “initializer element is not constant” when trying to initialize variable with const4个
我使用我的main.c文件,并在Mac OS X中使用gcc -std = c1x -c main.c进行编译,并且没有任何错误可以正常工作.那么我在linuxMint和RaspBerry Pi中做同样的事情,在这两种情况下,都会给我“初始化器元素不是常数”的错误.

有关代码的一个有问题的行的一个例子:

//STATIC GLOBAL CONSTANTSconst unsigned long long LATITUDE = (long) 3600000;const unsigned long long LONGITUDE = (long) 1810000;const unsigned long long MAX_COORDINATES_NUMBER = (LATITUDE-1) + LATITUDE*(LONGITUDE-1); //compiler error: initializer element is not constant

应该让我做算术,对吧?我可以用实际的数字替代它,它会奏效,但是会变得凌乱.并且它在我的Mac上正常工作.在GCC中有一些选项我必须在linux上指定(除了-std = c1x,你也不需要在Mac上)?

解决方法 C语言要求静态对象的初始化器是一个常量表达式. (由于静态对象的初始化在主开始之前发生,所以没有任何运行时评估的发生.)

C的const关键字并不意味着“常数”,虽然这些单词显然是相关的.常数表达式是在编译时可以(在某些情况下必须)进行评估的表达式. const表示只读.例如,在块范围(在函数定义内),这样:

const int r = rand();

是完全合法的.显然,在编译时无法对初始化器进行评估; const只意味着r可能在被激活之后可能不被修改.

当你写:

const unsigned long long LATITUDE = (long) 3600000;

对LATITUDE的引用不是一个常数表达式.编译器当然可以在编译时评估这样的参考,但C标准并不要求它. (常数和非常数表达式之间的界限必须被绘制在某个地方,并且该语言的作者选择使区分相对简单,几乎没有特殊情况).

现在确实可以定义C语言,以便LATITUDE是一个不变的表达式.在C中,我争辩说C采用类似的规则.但是在当前的C规则下,它不是,这意味着您不能在初始化程序中为静态对象使用LATITUDE.

这也意味着,clang(根据我的理解,在MacOS下键入gcc时调用的编译器)很可能不合格,因为它无法诊断此错误.在我自己的linux系统上,我发现,当用-std = c11 -pedantic调用时,gcc 4.7.2正确地诊断错误,但是clang 3.4没有.

除了2011年ISO C标准(也存在于1990年和1999年标准)的6.6节第10段之外,

An implementation may accept other forms of constant Expressions.

可以想象,clang接受LATITUDE作为一个常量表达式,因为它利用了这个权限 – 但是我至少还会期待至少有一个来自clang -std = c11 -pedantic -Wall -Wextra的警告,并且没有.

更新:当我编译以下内容:

#include <stdio.h>const unsigned long long LATITUDE = (long) 3600000;int main(voID) {    switch (0) {        case LATITUDE:            puts("wrong");            break;        default:            puts("ok(?)");            break;    }}

与clang 3.0与选项-std = c99 -pedantic,我得到:

c.c:7:14: warning: Expression is not integer constant Expression (but is allowed as an extension) [-pedantic]        case LATITUDE:             ^~~~~~~~1 warning generated.

与cl 3.4,警告是:

c.c:7:14: warning: Expression is not an integer constant Expression; folding it to a constant is a GNU extension [-Wgnu-folding-constant]        case LATITUDE:             ^~~~~~~~1 warning generated.

所以cl声确实认识到这不是一个恒定的表达;该错误是它不会警告MAX_COORDINATES_NUMBER的声明.

总结

以上是内存溢出为你收集整理的“初始化器元素不是常量”错误,在Linux GCC中没有任何原因,编译C全部内容,希望文章能够帮你解决“初始化器元素不是常量”错误,在Linux GCC中没有任何原因,编译C所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/1048709.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存