8
votes

C ++ Obtenir la taille d'un type dans une macro conditionnelle

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? XXX


1 commentaires

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/...


7 Réponses :


14
votes

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: xxx

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.


3 commentaires

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



3
votes

Taille de taille () est une Runtime 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. (voir Modifier 2)

EDIT: Comme indiqué dans des commentaires, Tailleof () est principalement calculé au moment de la compilation. En C99, Il peut être utilisé à l'exécution pour les tableaux .

Edit 2: Vous pouvez faire affirmer à la durée de construction à l'aide des techniques décrites dans ce thread .


3 commentaires

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 :-)



7
votes

Le préprocesseur fonctionne sans rien savoir sur les types, même la construction.

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).

EDIT: C99 et C ++ 0X ont également wchar_min et wchar_max macros dans


0 commentaires

4
votes

Je pense que des choses comme BOOST_STICTIC_ASSERT pourrait aider .


0 commentaires

1
votes
char _assert_wchar_t_is_16bit[ sizeof(wchar_t) == 2 ? 1 : -1];

0 commentaires

3
votes

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]


0 commentaires

1
votes

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: xxx

notez les virgules dans Tailleof (non signé, long, int) .


0 commentaires