初始化全局变量使用整数文字而不是const类型变量

时间:2015-08-03 12:03:06

标签: c initialization const

我正在学习一些openGL教程,因为它们都有C ++语法,我需要将它们转换为C语法,我对全局变量有一些问题。

所以我在共享头文件LUtil.h中有extern声明

#ifndef LUTIL_H
#define LUTIL_H

#include "LOpenGL.h"
#include <stdio.h>
#include <stdbool.h>

//Color modes
extern const int COLOR_MODE_CYAN;
extern const int COLOR_MODE_MULTI;

//Screen constants
extern const int SCREEN_WIDTH;
extern const int SCREEN_HEIGHT;
extern const int SCREEN_FPS;

extern int gColorMode;
extern GLfloat gProjectionScale;
...

我有我的LUtil.c文件,其中声明发生

#include "LUtil.h"

//The current color rendering mode
const int COLOR_MODE_CYAN = 0;
const int COLOR_MODE_MULTI = 1;

//constants
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
const int SCREEN_FPS = 60;

//The projection scale
int gColorMode = 0;
GLfloat gProjectionScale = 1.f;
...

现在,如果我像这样编译它就可以了。但是如果我在LUtil.c中初始化gColorMode常量

int gColorMode = COLOR_MODE_CYAN;

我收到编译错误,说我的初始值设定项不是常量,尽管已将COLOR_MODE_CYAN声明为const并使用它进行初始化。

为什么会这样?

3 个答案:

答案 0 :(得分:4)

C中,声明为const的变量不是常量,它被称为const - 限定变量。它不被视为编译时常量表达式。

您需要使用整数常量#define来完成工作。

FWIW,const的变量是C++的实常数(整数常量表达式)。

答案 1 :(得分:1)

C中的

const实际上并不创建“常量”。您仍然最终得到一个变量(保留内存),但编译器只是禁止写入该变量。

即使它被标记为const,你也可以将其强制转换为非const并修改它(请不要!)由于这个原因(以及可能的其他原因),它需要发出一个内存读取来访问const int常量的值,这在初始化另一个变量时是不允许的(它必须是编译时常量。)

相反,请在头文件中使用#define

答案 2 :(得分:0)

  

const int COLOR_MODE_CYAN

即使它是常量,

仍然是一个变量(这意味着如果你尝试使用代码修改它,编译器将抛出编译时错误)。这意味着当程序加载到内存中时,它将具有内存位置和值。它的值可以通过=运算符计算。并且所有运算符都应放在函数定义中,因为它们只能在运行时解析。

由于您要赋值的变量是全局变量。必须在编译时声明其初始值,以便编译器可以将其放入适当的段(.bss或.data)。但是赋值是一个变量,为了找出它的值,必须执行运算符。这在编译时无法完成。所以编译器会抛出一个错误,给我一个恒定的值,我可以分配给这样的全局变量,如3,4,5。