ti-enxame.com

Variável global em vários arquivos

Eu tenho dois arquivos de origem que precisam acessar uma variável comum. Qual é a melhor maneira de fazer isso? por exemplo.:

source1.cpp:

int global;

int function();

int main()
{
    global=42;
    function();
    return 0;
}

source2.cpp:

int function()
{
    if(global==42)
        return 42;
    return 0;
}

A declaração da variável global deve ser estática, externa ou deve estar em um arquivo de cabeçalho incluído por ambos os arquivos, etc?

63
kaykun

A variável global deve ser declarada extern em um arquivo de cabeçalho incluído pelos dois arquivos de origem e depois definido em apenas um desses arquivos de origem:

common.h

extern int global;

source1.cpp

#include "common.h"

int global;

int function(); 

int main()
{
    global=42;
    function();
    return 0;
}

source2.cpp

#include "common.h"

int function()
{
    if(global==42)
        return 42;
    return 0;
}
97
e.James

Você adiciona um "arquivo de cabeçalho", que descreve a interface para o módulo source1.cpp:

source1.h

#ifndef SOURCE1_H_
#define SOURCE1_H_

extern int global;

#endif

source2.h

#ifndef SOURCE2_H_
#define SOURCE2_H_

int function();

#endif

e adicione uma instrução #include em cada arquivo, que usa essa variável e (importante) que define a variável.

source1.cpp

#include "source1.h"
#include "source2.h"

int global;     

int main()     
{     
    global=42;     
    function();     
    return 0;     
}

source2.cpp

#include "source1.h"
#include "source2.h"

int function()            
{            
    if(global==42)            
        return 42;            
    return 0;            
}

Embora não seja necessário, sugiro o nome source1.h para o arquivo mostrar que descreve a interface pública para o módulo source1.cpp. Da mesma forma, source2.h descreve o que é público disponível em source2.cpp.

14
harper

Em um arquivo, você o declara como em source1.cpp, no segundo, como

extern int global;

É claro que você realmente não quer fazer isso e provavelmente deve postar uma pergunta sobre o que você está tentando alcançar para que as pessoas aqui possam lhe dar outras maneiras de alcançá-lo.

1
Patrick