11
votes

Simple Printf avec taille de papier ne fonctionne pas du tout

J'ai eu le code le plus simple pour afficher Tailleof () d'un type de données, dites un int.

error: invalid conversion from ‘int’ to ‘const char*’


2 commentaires

Ce n'est pas c ++ alors. En C ++, un littéral de caractères est de type char , pas int .


Voter pour fermer comme une simple faute de frappe. printf pour taille_t à: Stackoverflow.com/Questtions/174612/...


4 Réponses :


6
votes

Essayez printf ("% zu", tailleOf (int));

Les citations doubles sont manquantes.

Explore également si vous pouvez utiliser CSTDIO au lieu de stdio.h si vous êtes sur C ++.


5 commentaires

Merci, j'avais été codé dans PHP depuis trop longtemps .. Je continue d'oublier que les citations simples ne soient pas pour les cordes. Grrr.


@John: Regardez la réponse de @Richard Cook. Cela va expliquer pourquoi vous avez eu l'erreur. C'est une excellente occasion d'apprendre!


Fixez le type ou lancer le résultat de Tailleof à int . Sinon, votre code va briser les cibles 64 bits.


C'est printf pas impression . Et vous devriez utiliser "% zu" pour imprimer un taille_t


"% zu" Les spécifications de conversion sont GNU Addition et n'est pas portable. Cette spécification de conversion fait partie de C99, mais non incluse dans le projet C ++ 0X. Avec -pedantic Option Compiler se plaindre sur ce spécificateur.



9
votes

guillemets simples ' est utilisé pour délimiter les littéraux de caractères (type int in c) tandis que les devis doubles " sont utilisés pour délimiter les littéraux de chaînes ( Tapez "Array de Char " in c).

printf est déclaré comme suit: xxx

Ainsi tentent de passer un int où la fonction attend un const char * ou quelque chose qui peut être converti en const char * . .

Remarque: dans les littéraux de caractères C ++ sont de type Char , les littéraux de chaîne sont "Array de const Char ".


1 commentaires

Appréciez l'explication de la raison aussi: + 1



1
votes

Il devrait être:

printf("%i\n", sizeof(int));


5 commentaires

Non, il devrait être printf ("% zu \ n", Tailleof (int)); ou `printf ("% u \ n ", (non signé) Tailleof (int));" Vous «Répécez le mauvais type d'argument et le code se brisera sur des cibles 64 bits.


Mais cela ne vous donnera qu'un avertissement là-bas. Il sera automatiquement lancé.


AVERTISSEMENT A.K.A ERREUR (99,99% des temps), automatiquement (est la résolution de 0,01%)


Non, il ne peut pas le jeter automatiquement car il s'agit d'un argument dans une liste d'arguments variables. Les listes d'arguments variables sont nécessairement non voté; Un int est toujours transmis sous la forme d'un int , même si la fonction printf () s'attend à quelque chose d'autre.


Plus significativement, ze_t ! = int en général, et il n'y a aucune garantie que tailleof (Taille_t) == Tailleof (int) , surtout dans le monde 64 bits (non-fenêtres). Sur les machines Little-Endian (Intel), vous pouvez vous échapper, plus par accident que la conception; Sur les machines de Big-Endian (SPARC, PPC), vous ne vous en tirerez pas - vous imprimerez généralement des zéros lorsqu'il y a une valeur et des ordures lors de valeurs ultérieures.



16
votes
printf("%zu", sizeof(int));

printf, not print
%zu, not %i (it's an unsigned value, not an integer)
double quotes, not single quotes

0 commentaires