初始化全局变量适用于整数文字但不适用于 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。
我正在学习一些 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。