2017-01-29 2 views
-2

Мне нужно включить заголовочный файл в нескольких файлах CPP, содержащих целый ряд глобальных переменных. Но проблема, с которой я сталкиваюсь, заключается в том, что я не могу изменить переменные. Я могу инициализировать переменную в файле заголовка или в любом из файлов cpp, но когда я прихожу, чтобы изменить его, он либо не будет компилироваться, либо создаст 2 экземпляра переменной, которые не входят в сферу действия одного и того же. Мне нужен способ, который позволит мне изменить значение в функции.Модифицируемая глобальная переменная C++

Пример использования статического (Это создает экземпляры переменных вне сферы действия других переменных)

#pragma once 

namespace SCE 
{ 
static bool SC_DEBUG = false; 
static bool VSYNC = true; 
static int SC_LOG_LEVEL = 3; 
} 

Ive также попытался с помощью «Экстерн», но у меня не было никакой удачи с этим тоже.

#pragma once 

namespace SCE 
{ 
    extern bool SC_DEBUG; 
    extern bool VSYNC; 
    extern int SC_LOG_LEVEL; 
} 

Редактировать Я получаю сообщение об ошибке «Ошибка LNK2001: неразрешенный внешний символ„BOOL SCE :: КАДРОВ“(? КАДРОВ @ SCE @@ 3_NA)», когда я пытаюсь изменить переменную после его создания используя extern. Как я попробовать и отредактировать его, как так

int main() 
{ 
    SCE::VSYNC = false; 
    // ... 
} 

Решение Я использую установку мульти-проекта. Так что происходит, что «Project B» содержит заголовочный файл Global Variable и cpp, а «Project A» пытается изменить значение после его установки. Теперь по какой-то причине, поскольку «Project A» только вытягивает файл заголовка глобальной переменной, он получает определения переменных, но не может видеть инициализацию переменных, тем самым бросая множество странных ошибок.

ответ

0

В файле заголовка определяют переменные extern:

// globals.h 
namespace SCE 
{ 
    extern bool SC_DEBUG; 
    extern bool VSYNC; 
    extern int SC_LOG_LEVEL; 
} 

и определить их в файле реализации:

// globals.cpp 
namespace SCE 
{ 
    bool SC_DEBUG = false; 
    bool VSYNC = true; 
    int SC_LOG_LEVEL = 3; 
} 

Теперь вы можете включить заголовок в ваши другие файлы.

+0

Это не проблема, у меня, я могу создать их хорошо, но когда дело доходит до их редактирования, я получаю LNK2001 ошибки Ошибка: неразрешенный внешний символ «BOOL SCE :: VSYNC "(? VSYNC @ SCE @@ 3_NA) – 0xen

+0

@ 0xen Включили ли вы все свои файлы в свой проект? Если 'globals.cpp' не включен, вы получите эту ошибку. –

+0

Да, он компилируется и работает нормально, когда я не пытаюсь редактировать переменную, как показано выше в моем редактировании. – 0xen

0

Ваш вопрос немного неясен. Кажется, вы столкнулись с проблемой статических переменных. Статические переменные способны сохранять свою ценность, даже если они выходят за рамки. Они остаются в памяти до запуска программы. Напр.

#include<stdio.h> 
static int i = 0; 
int fun() 
{ 
    i= i+5; 
} 

int main() 
{ 
    fun(); 
    printf("%d ", i); 
    i= 10, 
    printf("%d ", i); 
    return 0; 
} 

Выход: 5 10