CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C++] static const

kufa
kufa
Niveau 9
03 mai 2004 à 20:08:57

Comme me l´a fait remarque lgv, c bizarre, mais:

static const int TEST_A = 0;

/ ** . .. */

int test = 1;

switch( test )
{
case TEST_A:
/ ** . .. */
}

ne compile pas sous vc.net02/03, mais no prob avec g++.. Une idee qq un?

/ kUfa

Altonfrere
Altonfrere
Niveau 10
03 mai 2004 à 20:33:20

" ne compile pas sous vc.net02/03"

ca compile très bien . ..

LGV
LGV
Niveau 28
03 mai 2004 à 20:46:08

ah ben non, je peux certifier que chez moi ça ne compile pas en tout cas.
J´ai VC++ . NET 2002, et dès que le const est en dehors de la portée du switch, ça passe pas ( pour " case label not constant", ce qui n´est pas du tout logique).

tu as quelle version exactement ?

Altonfrere
Altonfrere
Niveau 10
03 mai 2004 à 20:48:47

VC++ . NET 2002

Altonfrere
Altonfrere
Niveau 10
03 mai 2004 à 20:54:43

mais dis moi ? qu´appelles tu " en dehors de la portée du switch" ?

pour rappel les statics sont visibles que dans le module actif . .. si la déclaration se trouve dans un autre cpp c normal :)

LGV
LGV
Niveau 28
03 mai 2004 à 21:09:29

static ou pas, c´est le const le soucis ( en fait moi j´utilisais un static un sein d´une classe, nuance sur le mot clef... pratique ça encore LOL). Et ce n´est pas que le compilo ne " voit pas" la var. c´est qu´il la trouve pas const donc pas apte à etre utilisée dans le case

ex :

const int g_nValue = 0;

void function()
{
int b = 1;
switch ( b)
{
case g_nValue: . ... break;
}
}

ne compile pas : g_nValue case expresion not constant ( ? . .. c´est super louche)

alors que :

void function()
{
const int n_value = 0;

int b = 1;

switch ( b)
{
case n_value: . ... break;
}
}

compile ( c´est ça que je voulais dire par " const dans la meme portée que le switch").

Du coup, je pense que le compilo doit pas etre conforme au standard :/

( VC++ 2002 m´avait déjà refusé un static dans un template de template alors que ça passe tres bien en 2003 ou sous gcc)

Altonfrere
Altonfrere
Niveau 10
03 mai 2004 à 21:18:03

bin là toujours sous 2002 ta fonction passe très bien . ..

Je vois que des options de compilation qui pourraient provoquer ca . ..

Kouic
Kouic
Niveau 9
03 mai 2004 à 21:56:03

< "Du coup, je pense que le compilo doit pas etre conforme au standard :/ "

Quel standard ?
Pour celui du managed C++ special . NET tout est surement conforme.
Faut juste prendre le coups de main et oublier certain reflex C++.

PS: Mon posst n´est pas une tentative de troll... enfin pas trop.

kufa
kufa
Niveau 9
03 mai 2004 à 21:56:45

De la doc iso:
" case constant-expression :

where the constant-expression shall be an integral constant-expression. The integral constant-expression ( expr.const) is implicitly converted to the promoted type of the switch condition. No two of the case constants in the same switch shall have the same value after conversion to the promoted type of the switch condition"

" An integral constant-expression can involve only literals ( lex.literal), enumerators, const variables or static data members of integral or enumeration types initialized with constant expressions ( dcl.init)"

Ouaip, en tout cas ca devrait marcher..

Je viens de refaire un test dans un projet tout neuf, ca tourne, mais tjs pas dans une classe.. chelou, je regarderai en pronfondeur demain..

kufa
kufa
Niveau 9
03 mai 2004 à 21:57:38

Et pour moi le standard c´est le c++ ansi ISO/IEC FDIS 14882:1998(E)

Altonfrere
Altonfrere
Niveau 10
03 mai 2004 à 22:03:32

" mais tjs pas dans une classe.. chelou, je regarderai en pronfondeur demain"

Alors parlons peu parlons bien, quel est EXACTEMENT l´exemple qui ne marche pas ? ? jusqu´à présent tous les exemples donnés fonctionnent.

Si en effet il s´agit d´accéder à un member d´une classe, il faut comme pour tout namespace utiliser l´opérateur de résolution de portée :

case la_classe::la_variable : . ..

Altonfrere
Altonfrere
Niveau 10
03 mai 2004 à 22:10:21

case la_classe::la_constante je voulais dire :)

LGV
LGV
Niveau 28
03 mai 2004 à 22:35:27

kouic :
" Pour celui du managed C++ special . NET tout est surement conforme.
Faut juste prendre le coups de main et oublier certain reflex C++."
on a beau utiliser VC . NET on fait quand meme du C++ normal

altonfrere :
" il faut comme pour tout namespace utiliser l´opérateur de résolution de portée"
ben évidemment, je le répete, ce n´est PAS un soucis de visibilité
paste direct depuis mon code *qui ne marche pas* : ( je ne vire tout ce qui ne concerne pas le pb, sinon on s´en sort pas)

----- keyboard.h

class Keyboard
{
public:
static const CHAR ASCII_BACKSPACE;
};

----- keyboard.cpp

const CHAR Keyboard::ASCII_BACKSPACE = 8;

----- . cpp utilisant
. ..
CHAR c = m_console.input();
switch ( c)
{
case Keyboard::ASCII_BACKSPACE: / /(*)
/ / bla bla
break;
}
. ..

output :
error C2051: case expression not constant ( ligne ( *))

donc, c´est pas une question de résolution de portée visiblement, ni de visibilité, mais bien qu´étant const la static de Keyboard n´est pas acceptée comme case par le compilo :(

Altonfrere
Altonfrere
Niveau 10
03 mai 2004 à 22:41:06

ok cette fois ci je reproduis mais là où se trouve l´erreur c´est justement dans l´utilisation dans un autre cpp que le celui dans lequel est déclaré la constante !

static est restreint au cpp utilisé !

Altonfrere
Altonfrere
Niveau 10
03 mai 2004 à 22:52:29

si tu veux pouvoir l´utiliser n´importe où initialise là direct dans la définition de la classe :

class Keyboard
{
public:
static const CHAR ASCII_BACKSPACE=8;
};

LGV
LGV
Niveau 28
03 mai 2004 à 22:53:07

" static est restreint au cpp utilisé ! "

ben nan, static sur une var dans un code . cpp est complétement différent de static pour un membre d´une classe ; ex qui le montre :

dans le meme fichier que mon switch, je rajoute une ligne :

CHAR test = Keyboabrd::ASCII_BACKSPACE;

CHAR c = m_console.input();
switch ( c)
{
case Keyboard::ASCII_BACKSPACE: / / (*)
/ /bla bla
break;
}

CHAR test compile tres bien, et on accès à un membre statique depuis l´extétieur.
par contre le swith ne passe toujours pas

Kouic
Kouic
Niveau 9
03 mai 2004 à 22:59:33

"on a beau utiliser VC . NET on fait quand meme du C++ normal "

Ha, es ce que le code suivant marche ?
for(int i=0;i<10;i++) ;
for(int i=0;i<10;i++) ;

Sous VC++ 6.0, pouf, y connait pas les espaces de noms :)
Peut etre qu´ils l´on ameliorer sur le . NET, j´essayerai demain.

Altonfrere
Altonfrere
Niveau 10
03 mai 2004 à 23:01:08

oui ca marche :) même sur la 6.0 suffit de désactiver les extensions de langage Microsoft dans les project settings :)

Altonfrere
Altonfrere
Niveau 10
03 mai 2004 à 23:11:27

le + simple c´est de faire l´init dans le header . .. chose qui était impossible avant ( sur la 6.0) :

class Keyboard
{
public:
static const CHAR ASCII_BACKSPACE=8;
};

LGV
LGV
Niveau 28
03 mai 2004 à 23:15:49

" si tu veux pouvoir l´utiliser n´importe où initialise là direct dans la définition de la classe "

ah oui, ça ça marche, merci bien :D

maintenant je ne comprends toujours pas pourquoi.

en effet dans mon post de 22h53, je suis autorisé à utiliser un membre statique " n´importe où" ( cf. variable " test", ce qui me parait normal en fait), donc dans un cas comme dans l´autre il y a toujours un truc louche selon moi :-?

Sous forums
  • Aide à l'achat Mac
  • Création de Jeux
  • Linux
  • Création de sites web
  • Programmation
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment