2014-07-13 3 views
2

Dans le langage C, afin d'initialiser une variable locale statique à une inconnue de valeur je normalement faire lors de la compilation, quelque chose comme ceci (par exemple):Initialiser une variable locale statique à une inconnue de valeur lors de la compilation

void func() 
{ 
    static int var = INVALID_VALUE; 
    if (var == INVALID_VALUE) 
     var = some_other_func(); 
    ... 
} 

Dans le langage C++, je peux simplement faire:

void func() 
{ 
    static int i = some_other_func(); 
    ... 
} 

la seule façon (que je peux penser) pour un compilateur C++ pour le résoudre correctement, est en remplaçant ce code avec un mécanisme similaire à la C exemple ci-dessus.

Mais comment le compilateur déterminerait-il une valeur "correcte" invalide? Ou y a-t-il un autre moyen que je n'ai pas pris en considération?

Merci


Précision:

INVALID_VALUE est une valeur dont la fonction some_other_func ne retourne jamais.

Il est utilisé pour s'assurer que cette fonction n'est jamais invoquée plus d'une fois.

+0

Je suis un peu confus. Que représente 'INVALID_VALUE'? Et quel est le point? –

+0

@JosephMansfield: Je pense que OP signifie que la valeur 'some_other_func' ne retourne jamais pour vérifier si' var' a reçu une valeur de retour de cette fonction. – mafso

+0

@JosephMansfield: Une valeur que je considère invalide, et que je connais 'some_other_func' ne retournera jamais (par exemple, si c'était un pointeur, j'utiliserais normalement' NULL'). –

Répondre

2

Le compilateur ne générera pas de code pour le faire en fonction de sa valeur, mais sur un indicateur de thread sécurisé qui garantit que le code n'est exécuté qu'une seule fois.

Quelque chose comme ça:

void func() 
{ 
    static int i; 
    static bool i_initialized; 
    if (!i_initialized) { 
     i = some_other_func(); 
     i_initialized = true; 
    } 
} 

Sauf que généralement il n'est pas un bool mais un fil moyen de tester en toute sécurité, il.

+0

Merci. C'est à peu près la même réponse que celle donnée par @Dieter Lücking dans l'un des commentaires ci-dessus (ce qui me fait me sentir un peu stupide en posant cette question en premier lieu). –

1

Selon le code vu en désassemblant et déboguant le code compilé g ++, il y a une variable cachée qui est initialisée à 0 et quand l'initialisation est exécutée elle est mise à 1. Donc la prochaine fois que le code d'initialisation n'est pas réalisé.

Questions connexes