Hi,
So, in the interest of fixing this once and for all, the only option is to name a macro to handle these compiler specifics in one place, and then use that macro when defining 64-bit integral constants. The question is then, what to name it? The macro will be defined something like (omitting unsigned here):
I already used the following defines: (in winefile and explorer)
#ifdef _MSC_VER #define LONGLONGARG _T("I64") #else #define LONGLONGARG _T("L") #endif
#if defined __GNUC__ #define ZZZ(X) X##LL #elif defined _MSC_VER #define ZZZ(X) X##i64 #else #error Unknown compiler for 64-bit integral constant suffix #endif
Serious suggestions that have surfaced so far are:
DEFINE_INT64 MAKE_INT64
May be we can combine this ideas to a new proposal:
#ifdef __GNUC__ #define FMT_INT64 _T("L") #elif defined(_MSC_VER) #define FMT_INT64 _T("I64") #else #error Unknown compiler for 64-bit integral constant suffix #endif
"FMT" stands for "format string", I think this is a bit clearer than "DEFINE" or "MAKE".
This are some usage examples:
printf("%" FMT_INT64 "d", index); /* format 64 bit decimal integer */
sprintf(buffer, "%" FMT_INT64 "x", index); /* format 64 bit hex number, lower case */
sprintf(buffer, "%" FMT_INT64 "X", index); /* format 64 bit hex number, upper case */
_stprintf(buffer, TEXT("%") FMT_INT64 TEXT("X"), index); /* compatible both to UNICODE and ANSI builds */
Regards,
Martin