相关疑难解决方法(0)

"初始化器元素不是常量"错误在Linux GCC中没有任何理由,编译C

我把我的main.c文件用Mac OS X中的gcc -std = c1x -c main.c编译,它没有错误,工作正常.然后我在LinuxMint和Raspberry Pi上执行完全相同的操作,在这两种情况下,它都给出了"初始化元素不是常量"的错误.

带有相关代码的问题行的一个示例:

//STATIC GLOBAL CONSTANTS
const 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
Run Code Online (Sandbox Code Playgroud)

它应该让我做算术,对吗?我可以用实际数字替换它,它会起作用,但随后会变得混乱.无论如何,它在我的Mac上运行良好.在GCC中是否有一些选项我必须在Linux上指定(除了-std = c1x,你在Mac上也不需要)?

c linux macos gcc

13
推荐指数
1
解决办法
2万
查看次数

关于转换为整数常量表达式(在标准C中)

在标准C(我的意思是C99或C11)中,我们有所谓的整数常量表达式,它们是常量表达式,其操作数都是常量整数.还有其他约束,以避免表达式中的逗号运算符.

但是,在某些特殊情况下,允许使用其他非整数对象(甚至是非常量对象).
例如,如果将sizeof运算符应用于大小在转换时间中已知的对象,则允许将其作为整数常量表达式的一部分(请注意,sizeof始终返回整数值).

此外,有时也允许显式转换为整数类型.
标准C99建立以下规则:

标准C99,第6.6节(第6节):

整数常量表达式)应具有整数类型,并且只能具有整数常量,操作数,枚举常量,字符常量,结果为整数常量的sizeof表达式,以及作为强制转换的直接操作数的浮点常量.

标准C99

我的问题是: "浮动常数是演员的直接操作数"的确切含义是什么?

浮点常数类似于3.14e + 3,或者是0x2.11p-5.
也就是说,不是float类型的一般常量表达式,而只是浮点文字.
然后,我明白在上面的定义中只允许这样的事情:

 (int) 3.14
Run Code Online (Sandbox Code Playgroud)

但是不允许涉及浮动文字的操作.
这排除了以下情况:

 (int) -3.14  /* The minus sign is not part of the constant: it is an operator */
 (int) (3.14) /* The parenthesis are an operator acting on the literal 3.14 */
Run Code Online (Sandbox Code Playgroud)

最后一种情况不需要在转换时间中执行任何浮点算术运算,并且相当于没有括号:(int) 3.14.
但是,它不是演员直接操作数.

那么,我们是否必须考虑那(int) (3.14)是[有效整数常量表达式的一部分] (根据定义)?

另一方面,编译器GCC(带选项:-std …

c syntax c99 language-lawyer

9
推荐指数
1
解决办法
1194
查看次数

标签 统计

c ×2

c99 ×1

gcc ×1

language-lawyer ×1

linux ×1

macos ×1

syntax ×1