2015-08-03 1 views
0

Я работаю над некоторыми учебниками openGL, и поскольку у них есть синтаксис C++, мне нужно преобразовать их в синтаксис C, и у меня есть некоторые проблемы с глобальными переменными.Инициализация глобальной переменной работает с целым литералом, но не с переменной типа const

Так у меня extern заявления в общий заголовок LUtil.h

#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; 
... 

Теперь, если я составляю, как это оно работает. Но если я инициализировать константу gColorMode, как это в LUtil.c

int gColorMode = COLOR_MODE_CYAN; 

Я получаю ошибку компилятора о том, что мой инициализатор не является постоянным, несмотря на то объявили COLOR_MODE_CYANconst и инициализации с ним.

Почему это?

ответ

4

В C, переменная, объявленная const не постоянной, это называется const -qualified переменной. Это не считается выражением постоянной времени компиляции.

Для выполнения вашей работы необходимо использовать константу или #define.

FWIW, переменный с const является действительным постоянным (интегральной константой) в случае C++.

+0

Не используйте магическое число это код (ну есть исключения). FYI: «буквальная константа» (я бы тоже предпочел это) - это нестандартный термин. В стандарте используется константа [_ (integer) constant_] (http://port70.net/~nsz/c/c11/n1570.html#6.4.4). Это само по себе показывает, что C не имеет истинных констант (и C++ имеет своего рода химеру только на самом деле). – Olaf

+0

@Olaf Спасибо, сэр, как упоминалось в 6.4.4, обновляя мой ответ сейчас. :-) –

+0

Не нужно обновлять на самом деле, это было хорошо для меня уже. (Я просто пытаюсь добавить некоторый фон - не могу не сделать этого :-) – Olaf

1

const в C фактически не создает «постоянную». У вас все еще есть переменная (зарезервированная память), но компилятор просто запрещает запись этой переменной.

Даже если она помечена const, вы могли бросить его обратно неконстантных и изменить его (пожалуйста, не!) Из-за этого (и, возможно, другие причины), она требует испуская памяти для чтения доступа значение ваших const int констант, которые не допускается при инициализации другой переменной (она должна быть время компиляции постоянной.)

Вместо этого используйте #define в файле заголовка.

+1

Я согласен, что эти значения const в файле заголовка должны быть #defines. Тогда проблема с компилятором никогда не всплыла бы, и значение не было бы изменчивым, и не было бы места в памяти. Я бы поместил #defines прямо в заголовок, тогда только операторы extern будут gProjectionScale и gColorMode – user3629249

0

Const ИНТ COLOR_MODE_CYAN

еще переменная, даже если она постоянна (что просто означает, что компилятор выдаст ошибку во время компиляции, если вы пытаетесь изменить его с помощью кода). Это означает, что у него будет память и значение, когда программа будет загружена в память. Его значение можно вычислить с помощью оператора =. И все операторы должны быть помещены внутри определения функции, поскольку они могут быть разрешены только во время выполнения.

И поскольку переменная, которую вы назначаете значение, является глобальной переменной. Его начальное значение должно быть объявлено во время компиляции, чтобы компилятор мог поместить его в соответствующий сегмент (.bss или .data). Но назначенное значение является переменной, и для того, чтобы узнать его значение =, оператор должен быть выполнен.Что нельзя сделать во время компиляции. Так что компилятор выдает ошибку, которая дает мне постоянную ценность, которую я могу назначить на эту глобальную переменную, 3, 4, 5.

Смежные вопросы