初始化全局变量适用于整数文字但不适用于 const 类型变量

Initializing global variable works with integer literal but not with const type variable

我正在学习一些 openGL 教程,因为它们都有 C++ 语法,所以我需要将它们转换为 C 语法,而且我在使用全局变量时遇到了一些问题。

所以我在共享 header 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 并用它初始化。

这是为什么?

const 在 C 中实际上并没有创建 "constant"。您仍然会得到一个变量(保留内存),但编译器只是禁止写入该变量。

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

而是在头文件中使用 #define

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

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

FWIW,在 C++.

的情况下,具有 const 的变量是实常数( 整数常数表达式

const int COLOR_MODE_CYAN

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

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