2013-08-14 2 views
3

Хорошо, я знаю, что некоторые вопросы, подобные этому, вероятно, были помещены здесь раньше, но я ничего не мог найти об этом в любом месте в Интернете, поэтому я могу только предположить, что это не так. что хорошо с C++, и я сделал что-то неправильно, не понимая.Переменная в заголовочном файле, не объявленная в области

В моей игре я делаю, у меня есть мой основной .cpp-файл, который включает в себя заголовочный файл (давайте назовем его A), который включает в себя все другие файлы заголовков (назовем их B). В одном из этих заголовочных файлов B я включил файл A для доступа к булевому , который определен в нем. Ни один из файлов заголовков B, несмотря на включение файла A, который определяет переменную, кажется, может использовать его. Я действительно смущен этим и очень ценю некоторую помощь. Ниже приведен код, который я использовал:

pong_header.h (файл Заголовок, как описано выше)

#ifndef PONG_HEADER_H 
#define PONG_HEADER_H 

#include "SDL/SDL.h" 
#include "SDL/SDL_image.h" 
#include <stdio.h> 

#include "pong_graphics.h" 
#include "pong_core.h" 
#include "pong_entity.h" 
#include "pong_event.h" 

bool programRunning; 

#endif 

pong_event.h (один из заголовочных файлов B)

#ifndef PONG_EVENT_H 
#define PONG_EVENT_H 

#include "pong_header.h" 


void Pong_handleEvents(SDL_Event event) 
{ 
    while(SDL_PollEvent(&event)) 
    { 
     switch(event.type) 
     { 
     case SDL_QUIT: 
      programRunning = true; 
      break; 
     case SDL_KEYDOWN: 
      switch(event.key.keysym.sym): 
      case SDLK_ESCAPE: 
       programRunning = false; 
       break; 
      break; 

     default: 
      break; 
     } 
     Pong_handleEntityEvents(event) 
    } 
} 

другой доступ к файлам B programRunning таким же образом.

Точный код ошибки :: Blocks дает мне следующим образом Pong\pong_event.h|20|error: 'programRunning' was not declared in this scope

+0

Что вы выложили должны работать. Я подозреваю, что вы описываете и что на самом деле происходит, немного отличается? –

+1

Сделать это extern bool programRunning; и это тоже в источнике. (bool работает). Не забудьте украсить его импортом/экспортом, если это dlll –

ответ

4

Вопрос заключается в том, что pong_header.h включает pong_event.hперед тем он объявляет programRunning, поэтому, когда pong_event.h пытается включить pong_event.h, включаемые охранники предотвратить его. Исправление состоит в том, чтобы просто переместить объявление bool programRunning в начало pong_event.h.

Теперь, это приведет к другой проблеме - каждый .cpp файла, который включает в себя любой из этих заголовков получит свою собственную копию programRunning, которая либо вызвать ошибку ссылки (множественное определение из programRunning), или будет декомпилировать , но не будет работать так, как вы ожидаете.

То, что вы хотите сделать, это объявить его как экстерном, т.е.

extern bool programRunning; 

Затем в одном ваших .cpp файлов (желательно в зависимости от того имеет int main), вы на самом деле объявить его (т.е. безextern):

bool programRunning; 
+0

Большое спасибо, это сработало отлично! – frasertmay

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