web-dev-qa-db-fra.com

Déclaration de variable globale C ++


Ce que je veux faire, c'est simplement définir une variable dans un fichier d'en-tête et l'utiliser sur deux fichiers cpp différents sans redéfinir cette variable chaque fois que j'inclus cet en-tête
Voici comment j'ai essayé:

Variables.h

#ifndef VARIABLES_H // header guards
#define VARIABLES_H

static bool bShouldRegister;

#endif

(J'ai aussi essayé extern mais rien n'a changé)

Et dans un fichier cpp je lui donne une valeur ::bShouldRegister = true ou bShouldRegister = true;

Dans mon autre fichier cpp, je vérifie sa valeur en créant un thread et vérifie sa valeur dans une boucle (et oui ma fonction de thread fonctionne bien)

 while (true)
 {
     if (::bShouldRegister) // Or if (bShouldRegister)
        {
            MessageBox(NULL,"Value Changed","Done",MB_OK|MB_ICONINFORMATION);
        }
  Sleep(100);
 }

Et oui, ce MessageBox n'apparaît jamais (bShouldRegister ne devient jamais vrai: /)

31
Shahriyar

Vous devez utiliser extern, sinon vous avez bShouldRegister dans chaque unité de traduction avec des valeurs probablement différentes.

Mettez ceci dans un fichier d'en-tête (.h):

extern bool bShouldRegister;

Mettez cela juste dans l'un des fichiers d'implémentation (.cpp):

bool bShouldRegister;
51
deepmax

Une manière plus similaire à C++ serait d'utiliser un membre de classe, indiqué syntaxiquement par le mot clé static. Les variables membres de la classe ont un lien implicite external.

#ifndef VARIABLES_H
#define VARIABLES_H

class RegUtil {
public:

    static bool bShouldRegister;

};

#endif

dans l'un de vos fichiers cpp (peut-être variables.cpp), vous devez définir ce membre de classe:

#include "variables.h"

bool RegUtil::bShouldRegister;
18
Wolf

Vous devez définir la variable dans l'un des modules:

bool bShouldRegister;

Ensuite, déclarez-le extern (pas static!) Dans l'en-tête:

extern bool bShouldRegister;
9
Fred Foo

Si vous pouvez utiliser C++ 17, envisagez d'utiliser une variable en ligne:

// in a header file
inline bool bShouldRegister = true;

Voir Comment fonctionnent les variables en ligne? pour plus d'informations.

6
bcd