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: /)
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;
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;
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;
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.