2009-04-08 8 views
0

D'après ce que je comprends, #define x y et const int x = y; devraient fonctionner de manière identique sous le compilateur Visual Studio, mais const int x = y; est la méthode préférée.Problème avec const vs #define dans Visual Studio

Le code C je ressemble à ceci:

static const int x = 100000; 

void SomeFunction(...) 
{ 
    volatile static int y = x; 
    ... 
} 

Le problème est ici avec la déclaration de y. Si j'utilise un #define pour x, alors il n'y a pas de problèmes, mais l'utilisation du code ci-dessus entraîne le retour du compilateur avec "l'erreur c2099: l'initialiseur n'est pas une constante". J'essaye de compiler à partir de la ligne de commande, et je n'utilise pas d'indicateurs de compilation, donc je ne suis pas sûr de devoir définir un drapeau pour que le compilateur optimise la const - ou si je suis tombé sur une sorte de cas particulier.

Compiler le programme en tant que programme C++ fonctionne également, mais je préfère éviter cela, si possible.

+0

Notez que lorsque vous utilisez #define, x n'est pas explicitement typé ... –

+0

Votre exemple compile bien pour moi. – zdan

+1

La compilez-vous en tant que fichier .c et non en tant que fichier .cpp? – Swiss

Répondre

2

Je ne connais pas la norme C à l'envers mais j'ai déjà lu à ce sujet. Voici ma compréhension. Un compilateur ANSI C strict vous permettra seulement d'utiliser des expressions constantes en tant qu'initialiseurs. Notez qu'une expression constante peut seulement impliquer des valeurs littérales, pas des variables qui sont const-qualifiées. Je crois que c'est parce que pendant la compilation, le compilateur doit calculer la valeur à initialiser afin qu'il puisse statiquement pousser cette valeur sur la pile sans aucun calcul requis au moment de l'exécution. Même les variables const-qualifiées peuvent changer (en supprimant le qualificatif const et en changeant la valeur).

const int x = 5; 
*(int *)&x = 3; 

Je pense C99 vous permet d'initialiser les variables const qualifié à périmètre fonction uniquement des variables de fichiers portée sont toujours liés par la même restriction.

+0

La modification de la valeur d'une variable qualif const est un comportement indéfini - le comité de normalisation ne l'interdira pas en raison de la possibilité d'un comportement indéfini –

+0

Je suis sûr que c'est un comportement indéfini, mais comme il s'agit d'un comportement indéfini, certains compilateurs pourraient théoriquement autoriser l'initialisation à partir de variables const-qualifiées. Le compilateur C de Microsoft ne le fait évidemment pas :( – dreamlax

0

Cela pourrait être résolu avec une autre variable de garde:

void SomeFunction(...) 
{ 
    static int initialized_y=0; 
    volatile static int y; 
    if(initialized_y==0) 
     y = x; 
    initialized_y=1; 
    ... 
} 

Vous pouvez également activer cet idiome dans une macro.

Questions connexes