9
votes

Tous les compilateurs C ++ permettent-ils d'utiliser une variable de membre de classe INT STATIC constituée comme une matrice liée?

en VC ++ Lorsque j'ai besoin de spécifier un tableau lié à une variable de membre de la classe, je le fais de cette façon: xxx

(s'il vous plaît ne me parlez pas d'utiliser std :: vecteur ici)

De cette façon, j'ai une constante qui peut être utilisée comme une matrice liée et plus loin dans le code de classe pour spécifier des contraintes de relève des boucles et en même temps, il n'est visible nulle part ailleurs. < p> La question est de savoir si cette utilisation de statique const int Les variables de membre uniquement autorisées par VC ++ ou sont-elles généralement autorisées par d'autres compilateurs généralisés?


1 commentaires

"S'il te plaît, ne me parle pas d'utiliser std :: Vector Ici" - Non, ce ne serait pas approprié. Vous devriez utiliser std :: tr1 :: tableau . :)


9 Réponses :


1
votes

J'ai cessé de déranger la portabilité de ces années. Il y a peut-être encore des compilateurs qui ne le soutiennent pas, mais je n'ai rencontré aucun d'entre eux récemment.


0 commentaires

13
votes

Ce comportement est valide selon la norme C ++. Tout compilateur récent devrait le soutenir.


0 commentaires

6
votes

Ceci a été standard C ++ pendant plus d'une décennie maintenant. Il est même soutenu par VC - Que pourriez-vous vouloir de plus? (@Neil: Qu'en est-il de Suncc? : ^> )


0 commentaires

7
votes

Je crois que Visual Studio 2005 et au-delà le soutient. Le compilateur Xcode C ++ également (c'est effectivement GCC).

Si vous souhaitez être en sécurité, vous pouvez toujours utiliser l'ancien piratage enum que j'ai appris d'efficace C ++. Cela va comme ça: xxx

espère que cela aide.


1 commentaires

L'ENUM 'Hack' ne devrait pas être nécessaire si vous traitez du code C ++, mais si vous souhaitez que la déclaration fonctionne en C ou en VC ++ 6, c'est mieux que la méthode la plus courante d'utilisation #define dans mon avis.



2
votes

Je suis sûr que cela fonctionnera également avec GCC et Solaris, mais je ne peux pas vérifier cela pour le moment.

À l'avenir, vous pouvez prolonger l'idée comme suit: P>

Class<5> c;


2 commentaires

Vous utilisez un numéro de magie, qui est ce que la question cherchait à éviter.


@Neil: Cependant, le numéro de magie 5 ci-dessus pourrait être remplacé par un statique const int d'une classe que "C" pourrait se retrouver un membre de.



-1
votes

Il est possible de répondre à des questions comme celle-ci en faisant référence à la norme ISO C de la speicifcation mais la spécification est difficile pour les gens de plus difficile à lire. Je pense que les charnières de réponse la plus simple sur deux choses:

  • Microsoft Visual Studio 2005 et jusqu'à la mise en œuvre est une relativement conforme C ++. Si cela vous permet de faire quelque chose, les chances sont la norme.
  • Télécharger quelque chose comme Code :: Blocks pour obtenir un compilateur GCC pour essayer des choses dehors. Si cela fonctionne dans MS et le CCG, les chances sont vraiment, son standard.

1 commentaires

La spécification est très facile à obtenir (pour 30 $): Stackoverflow.com/questions/81656/... Lecture de la spécification est une histoire différente, mais de sérieux Prganisateurs C ++ devraient probablement toujours y référer de temps en temps: Stackoverflow.com/Questtions/1123455/...



14
votes

Ceci est valide C ++ et la plupart (tous?) Les compilateurs raisonnablement modernes le soutiennent. Si vous utilisez Boost, vous pouvez obtenir une prise en charge portable de cette fonctionnalité sous la forme de boost_static_constant macro: xxx

La macro est étendue à statique const int int int Numérosofcolors = 16 Si le compilateur prend en charge ceci, sinon il recèle Enum {numéryofcolors = 16}; .


0 commentaires

3
votes

En plus d'autres réponses que vous pouvez utiliser la fonction suivante do déterminer le nombre d'éléments dans les tableaux statiquement alocated:

template<typename T, size_t length>
size_t arrayLength(T (&a)[length])
{
    return length;
}


0 commentaires

4
votes

Oui, c'est 100% légal et devrait être portable. La norme C ++ le dit en 5.19 - Expressions constantes »(emphase des miennes):

à plusieurs endroits, C ++ nécessite des expressions qui évaluent à une constante intégrale ou d'énumération: comme des limites de tableau (8.3.4, 5.3.4), comme des expressions de cas (6.4.2), en tant que longueurs de champ de bit (9.6) , comme initialisateurs d'énumérateur (7.2), en tant qu'indialiseurs de membres statiques (9.4.2), ainsi que des arguments de modèle non intégral ou énumérant non-type (14.3). P>

constant-expression:
    conditional-expression


0 commentaires