我正在学习一些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
并使用它进行初始化。
为什么会这样?
答案 0 :(得分:4)
在C
中,声明为const
的变量不是常量,它被称为const
- 限定变量。它不被视为编译时常量表达式。
您需要使用整数常量或#define
来完成工作。
FWIW,const
的变量是C++
的实常数(整数常量表达式)。
答案 1 :(得分:1)
const
实际上并不创建“常量”。您仍然最终得到一个变量(保留内存),但编译器只是禁止写入该变量。
即使它被标记为const
,你也可以将其强制转换为非const并修改它(请不要!)由于这个原因(以及可能的其他原因),它需要发出一个内存读取来访问const int
常量的值,这在初始化另一个变量时是不允许的(它必须是编译时常量。)
相反,请在头文件中使用#define
。
答案 2 :(得分:0)
即使它是常量,const int COLOR_MODE_CYAN
仍然是一个变量(这意味着如果你尝试使用代码修改它,编译器将抛出编译时错误)。这意味着当程序加载到内存中时,它将具有内存位置和值。它的值可以通过=运算符计算。并且所有运算符都应放在函数定义中,因为它们只能在运行时解析。
由于您要赋值的变量是全局变量。必须在编译时声明其初始值,以便编译器可以将其放入适当的段(.bss或.data)。但是赋值是一个变量,为了找出它的值,必须执行运算符。这在编译时无法完成。所以编译器会抛出一个错误,给我一个恒定的值,我可以分配给这样的全局变量,如3,4,5。