I do a fair amount of my development work on an AMD64 box.

During compilation, I see a lot of warnings of the form:
format ‘%llx’ expects type ‘long long unsigned int’, but argument 3 has type 
‘uint64_t’

gcc thinks that it should be "%lx" if the wordsize is 64 bits.

There is a way to fix this - using the PRIx64 (for example) macro from 
<inttypes.h>.

Here is an example of what it will look like:
--- libmapi/mapidump.c  (revision 716)
+++ libmapi/mapidump.c  (working copy)
@@ -21,6 +21,10 @@
 #include <libmapi/mapidump.h>
 #include <libmapi/proto_private.h>

+#ifndef __STDC_FORMAT_MACROS
+#define __STDC_FORMAT_MACROS 1
+#endif
+#include <inttypes.h>
 /**
    \file mapidump.c

@@ -49,7 +53,7 @@
                break;
        case PT_I8:
                data = get_SPropValue_data(&lpProp);
-               printf("%s%s: %llx\n", sep?sep:"", proptag, (*(const uint64_t 
*)data));
+               printf("%s%s: %"PRIx64"\n", sep?sep:"", proptag, (*(const 
uint64_t *)data));
                break;
        case PT_STRING8:
        case PT_UNICODE:
@@ -616,9 +620,9 @@

 _PUBLIC_ void mapidump_newmail(struct NewMailNotification *newmail, const char 
*sep)
 {
-       printf("%sParent Entry ID: 0x%llx\n", sep?sep:"", newmail->FID);
+       printf("%sParent Entry ID: 0x%"PRIx64"\n", sep?sep:"", newmail->FID);
        fflush(0);
-       printf("%sMessage Entry ID: 0x%llx\n", sep?sep:"", newmail->MID);
+       printf("%sMessage Entry ID: 0x%"PRIx64"\n", sep?sep:"", newmail->MID);
        fflush(0);
        printf("%sMessage flags:\n", sep?sep:"");
        fflush(0);


It probably won't work if the C compiler or headers aren't C99 compatible.

As an alternative, we could define them ourselves
#ifndef PRIx64
#if __WORDSIZE == 64
  #define PRIx64        "lx"
#else
  #define PRIx64        "llx"
#endif
#endif

Thoughts? Comments on relative portability?

Brad
_______________________________________________
devel mailing list
devel@openchange.org
http://mailman.openchange.org/listinfo/devel

Reply via email to