2013-06-06 3 views
1

Ma question est: Comment imprimer le "pMessage", "aiLength", "szDataSize"?Comment imprimer le "apr_uint32_t"?

EventInfo* pEventInfo 

typedef struct { 
     char* pMessage; 
     SocketHeader* pSocketHeader; 
     PipeHeader* pPipeHeader; 
} EventInfo; 

typedef struct { 
     apr_uint32_t aiLength; 
} PipeHeader; 

typedef struct { 
     apr_uint32_t szDataSize; 
} SocketHeader; 

Qu'est ce que le «apr_uint32_t»?

+0

Quelle bibliothèque utilisez-vous? –

Répondre

2

Bien que je pense que la réponse de @ pied-de-mouche - utilisant les paramètres propres de conversion de chaîne de format C99 dans <inttypes.h> - est probablement le plus élégant, le type unsigned long est garanti d'être au moins 32 bits, de sorte que vous pouvez simplement utiliser le spécificateur %lu avec cast:

printf("%lu\n", (unsigned long) value); 

Qui ne nécessite pas C99. Ce n'est pas vraiment un problème aujourd'hui, mais IIRC, APR ne suppose pas un compilateur C99 non plus, ou ils n'auraient pas pris la peine de rouler leurs propres types 'exactes'.

+0

Je l'ai essayé. Le résultat est le même pour Navnath. Mais je pense que ton chemin est meilleur. Alors merci beaucoup. –

+0

Cela dépend de 'typedef' pour quel type de données, Si la bibliothèque Say est' typedef' pour le type de données donné alors pourquoi supposer, Et est-ce 'unsigned int' égal à' unsigned long'? Et quelle est la différence entre 'apr_uint32_t' et' apr_ino_t' –

+0

+1 et intelligent. Aussi, [C99 n'est certainement pas partout] (http://stackoverflow.com/questions/16908899). – pilcrow

0
+0

Non, le typedef est spécifique à la plateforme et est explicitement * non * garanti d'être un int non signé. – pilcrow

+0

Merci pour l'information. –

0

Essayez cette

EventInfo eventInfo; 
SockHeadExample sHead; 
PipeHeader pipeHeader 
printf("%s", eventInfo.pMessage); // <- pMessage 
printf("%u", sHead.szDataSize); // <- szDataSize 
printf("%u", pipeHeader.aiLength); // <- aiLength 

travail

apr_uint32_t est unsigned int il est typedefpar bibliothèque Apache

Reference

+0

La même référence que vous liez aux avertissements: * "Les valeurs réelles des macros et typedefs sur cette page sont spécifiques à la plate-forme et ne doivent pas être comptées!" * – pilcrow

+0

si les données sont toujours scaler vous devriez être en mesure d'imprimer en toute sécurité ("% lld ", (long long) aprVal); –

+0

Merci beaucoup Navnath. J'ai essayé. Sa réponse était juste. –

2

apr_uint32_t est un entier non signé de 32 bits portable à partir du projet Apache Portable Runtime.

Vous devez le formater de la même façon que vous imprimez un entier non signé natif dont vous savez qu'il a une largeur de 32 bits: use the PRIu32 format specifier as recommended in this answer.

(Comme une note de côté, d'autres types portables may viennent avec leurs propres spécificateurs printf spécifiques à la plate-forme, par exemple, apr_uint64_t a une APR_UINT64_T_FMT correspondante. Cependant, ce type ne fonctionne pas.)

0

apr_uint32_t est unsigned int, donc vous devriez savoir quoi faire ensuite.

+1

Non, le typedef est spécifique à la plateforme et est explicitement * non * garanti d'être un entier non signé. – pilcrow

+0

ouais mais il devrait être assez proche de uint32_t si vous arrivez à être C99 qui apr ne le fait pas, donc le définir leur propre ... si vous êtes sur un système en cours d'utilisation, à l'exception des plateformes embarquées et de recherche, vous aura un int 32 bits. –