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: (s'il vous plaît ne me parlez pas d'utiliser std :: vecteur ici) p> 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> < p> La question est de savoir si cette utilisation de statique const int code> 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? P> P>
9 Réponses :
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. P>
Ce comportement est valide selon la norme C ++. Tout compilateur récent devrait em> le soutenir. P>
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? : ^> code>) p>
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: p> espère que cela aide. P> p>
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.
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;
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 code> d'une classe que "C" pourrait se retrouver un membre de.
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: p>
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/...
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 La macro est étendue à boost_static_constant code> macro:
statique const int int int Numérosofcolors = 16 Code> Si le compilateur prend en charge ceci, sinon il recèle
Enum {numéryofcolors = 16}; code>. P> p>
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; }
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
"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 code>.
:) code>