глобальная переменная не работает - PullRequest
0 голосов
/ 23 февраля 2012

У меня есть глобальный int Я хочу изменить в разных файлах, по какой-то причине он не работает.

У меня есть:

// test.h

 #include <windows.h>

static int start1; //want to use this globally.

//declare
void something();

// test.cpp

#include "test.h" 

extern int start1;

void something()
{
    start1 = start1 + 1;
}

// main.cpp

#include "test.h"
#include "stdafx.h"
#include <iostream>

int _tmain(int argc, _TCHAR* argv[])
{
    start1 = 3;
    something();
    return 0;
}

Почему при входе в something() вместо start1 0из 3?Я часами пытался создать глобальную переменную, и она не работает.Пожалуйста, кто-нибудь может уточнить?

Ответы [ 3 ]

10 голосов
/ 23 февраля 2012

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

Канонический шаблон заключается в объявлении переменной как extern в заголовочном файле и ее определении"обычно" в одном исходном файле.

3 голосов
/ 23 февраля 2012

Вы должны объявить свой int как extern в вашем заголовке. Ему не нужны никакие квалификаторы, когда вы определяете его в своем файле .cpp. Статический классификатор фактически означает, что объявленное вами целое число доступно только в текущем модуле перевода, поэтому каждый файл .cpp получит свою версию.

0 голосов
/ 20 февраля 2013

Если вы поместите

static int start1;

во все исходные файлы , вы получите статический эффект, в котором данные будут отдельными адресами внутри каждого.Тогда вы можете сохранить отдельные значения / контент для каждой единицы .

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

Я просто запустил аналогичную настройку вC и статические переменные действуют одинаково.

...