Y a-t-il un moyen de faire quelque chose comme celui-ci en C ++, il semble que la taille d'on ne peut y être utilisé pour une raison quelconque?
7 Réponses :
Non, cela ne peut pas être fait car toute expansion macro (# ... choses) est effectuée dans l'étape du pré-processeur qui ne sait rien sur les types du code C ++ et ne doit même pas savoir quoi que ce soit à propos de la langue! Il suffit de se développer / vérifie la # ... des choses et rien d'autre!
Il existe d'autres erreurs courantes, par exemple: p> Vous ne pouvez accéder à et utilisez Dans #iS qui sont définis via des options de ligne de commande sur le compilateur ou via #define. p> p>
De nos jours, le préprexesseur n'existe pas parfois.
@ Cole Johnson: Je ne vois jamais personne en omettant complètement le pré-processeur. Connaissez-vous de tout compilateur C ou C ++ sans pré-processeur?
Pas que je sache de. Je parlais de choses comme #pragma code>
Taille de taille () est une Runtime Strike> Strong> Fonction de compilation. Vous ne pouvez pas appeler cela dans une directive de préprocesseur. Je ne pense pas que vous puissiez vérifier la taille de WCHAR_T lors du prétraitement. Strike> (voir Modifier 2) P>
Tailleof () n'est pas une fonction d'exécution. C'est une expression du temps compilé qui est évaluée par le compilateur sur la compilation-time (mais après le temps de pré-processeur).
Merci, n'était pas au courant de cela. Mis à jour en conséquence.
@nagul: D'accord, peut-être pas toujours une expression de la compilation :-)
Le préprocesseur fonctionne sans rien savoir sur les types, même la construction. p>
BTW, vous pouvez toujours faire la vérification à l'aide d'une fonctionnalité STATIC_ASSERT comme (Boost en a une par exemple, C ++ 0x en aura un). P>
EDIT: C99 et C ++ 0X ont également wchar_min code> et
wchar_max code> macros dans
char _assert_wchar_t_is_16bit[ sizeof(wchar_t) == 2 ? 1 : -1];
Ne seriez-vous pas fondamentalement à ce que vous voulez (Compiler Erreur W / O le message de fantaisie) à l'aide d'un C_ASsert?
#define C_ASSERT(e) typedef char __C_ASSERT__[(e)?1:-1]
J'ai développé certaines macros qui vous permettront efficacement d'utiliser la taille de l'état macro. Ils sont dans un fichier d'en-tête que j'ai téléchargé ici ( Licence MIT).
Il permettra à code comme celui-ci: p> notez les virgules dans Tailleof (non signé, long, int) code>. p> p>
Appris que les affirmations de construction sont possibles, grâce à votre question. Cette technique est discutée en détail sur ce fil: Stackoverflow.com/Questtions/174356/...