全局变量'初始值不是常数'?

Gri*_*han 5 c global-variables

因此,在编译以下代码时,我得到'initializer element not constant'错误:

#include <stdlib.h>
#include <stdio.h>
#include <math.h>

float wl = 2.0f;
float k = 2.0f * (float) M_PI / wl;

int main ()
{
     //Do stuff
}
Run Code Online (Sandbox Code Playgroud)

如果我"float k"在main方法中移动,没有错误,但这对我来说不是一个选项,因为我需要浮动k作为全局变量.即使我改变它:

const float wl = 2.0f;
const float k = 2.0f * (float) M_PI / wl;
Run Code Online (Sandbox Code Playgroud)

错误仍然发生.我该如何解决?

her*_*tao 7

根据C99标准:

§6.7.8初始化

  1. 具有静态存储持续时间的对象的初始化程序中的所有表达式应为常量表达式或字符串文字.

使用const在这里没有用,因为在C中,const变量不是真正的常量.查看此帖子了解更多详情.


要解决这个问题,可以wl使用预处理器使其保持不变:

#define wl 2.0f
Run Code Online (Sandbox Code Playgroud)

通过这样做,2.0f * (float) M_PI / wl可以是编译时常量.


小智 2

Global变量static初始化时存储在数据段(DS)中,未初始化时存储在符号起始块(BSS)中。这些变量具有固定的内存位置,并且内存在编译时分配。
C 不允许用非常量值初始化全局值。

C99 Standard: Section 6.7.8:

All the expressions in an initializer for an object that has static storage duration shall be constant expressions or string literals.
Run Code Online (Sandbox Code Playgroud)

您需要将初始化移至main保持声明为全局的内部

float wl = 2.0f;
float k  ;

int main ()
{
      k = 2.0f * (float) M_PI / wl;
     //Do stuff
}
Run Code Online (Sandbox Code Playgroud)