Developer forums (C::B DEVELOPMENT STRICTLY!) > Development
%I64d or %lld in the plugins\compilergcc\depslib\src\cache.c
(1/1)
ollydbg:
--- Code: --- /* C::B patch: Compatibility with 64 bit compiler / OS */
#if defined(_WIN64)
sscanf(buf, "%I64d %n", &timeval, &n);
#else
sscanf(buf, "%lld %n", &timeval, &n);
#endif
--- End code ---
When I build the C::B, I see some code in the "plugins\compilergcc\depslib\src\cache.c" cause some warnings:
--- Code: ---D:\code\cb\cb_sf_git\cccrash2019\src\plugins\compilergcc\depslib\src\cache.c: In function 'cache_write':
D:\code\cb\cb_sf_git\cccrash2019\src\plugins\compilergcc\depslib\src\cache.c:173:33: warning: format '%d' expects argument of type 'int', but argument 3 has type 'time_t' {aka 'long long int'} [-Wformat=]
173 | fprintf(f, "%I64d %s\n", h->time, h->file);
| ~~~~^ ~~~~~~~
| | |
| int time_t {aka long long int}
| %I64lld
--- End code ---
I'm using msys2/mingw64's g++ compiler, and the "#if defined(_WIN64)" is true, so my question is:
why not just use the %lld?
Wkerry:
Try the following:
#if (_USE_LONG_TIME_T)
sscanf(buf, "%ld %n", &timeval, &n);
#else
#if defined(PRId64)
sscanf(buf, "%" PRId64 " %n", &timeval, &n);
#else
sscanf(buf, "%lld %n", &timeval, &n);
#endif
#endif
and
#if (_USE_LONG_TIME_T)
fprintf(f, "%ld %s\n", h->time, h->file);
#else
#if defined(PRId64)
fprintf(f, "%" PRId64 " %s\n", h->time, h->file);
#else
fprintf(f, "%lld %s\n", h->time, h->file);
#endif
#endif
This works better than the existing code. Give it a quick hack/ try, but you may find a better way.
ollydbg:
--- Quote from: Wkerry on February 04, 2025, 08:39:58 am ---Try the following:
#if (_USE_LONG_TIME_T)
sscanf(buf, "%ld %n", &timeval, &n);
#else
#if defined(PRId64)
sscanf(buf, "%" PRId64 " %n", &timeval, &n);
#else
sscanf(buf, "%lld %n", &timeval, &n);
#endif
#endif
and
#if (_USE_LONG_TIME_T)
fprintf(f, "%ld %s\n", h->time, h->file);
#else
#if defined(PRId64)
fprintf(f, "%" PRId64 " %s\n", h->time, h->file);
#else
fprintf(f, "%lld %s\n", h->time, h->file);
#endif
#endif
This works better than the existing code. Give it a quick hack/ try, but you may find a better way.
--- End quote ---
Hi, thanks, I just tested it. I think your suggested code is better than the current code. :)
ollydbg:
Can anyone help to test the below patch, in my 64bit gcc compiler under windows system, it remove the build warnings:
--- Code: ---From 38063feccee0827493c153f71c4e102f9d15428c Mon Sep 17 00:00:00 2001
From: asmwarrior <hidden@example.com>
Date: Sat, 8 Feb 2025 11:09:06 +0800
Subject: [PATCH] - compilergcc plugin: fix build warning in the depslib, see
discussion here:
%I64d or %lld in the plugins\compilergcc\depslib\src\cache.c
https://forums.codeblocks.org/index.php/topic,25960.0.html
---
src/plugins/compilergcc/depslib/src/cache.c | 23 +++++++++++++++------
src/plugins/compilergcc/depslib/src/hash.c | 7 +++++--
2 files changed, 22 insertions(+), 8 deletions(-)
diff --git a/src/plugins/compilergcc/depslib/src/cache.c b/src/plugins/compilergcc/depslib/src/cache.c
index 8e90756f..1d2f8211 100644
--- a/src/plugins/compilergcc/depslib/src/cache.c
+++ b/src/plugins/compilergcc/depslib/src/cache.c
@@ -16,6 +16,9 @@
#include "newstr.h"
#include "cache.h"
+/* C::B patch: Compatibility with 64 bit compiler / OS*/
+# include "inttypes.h" // PRId64
+
#include "depslib.h" /* for struct depsStats */
extern struct depsStats g_stats;
@@ -138,10 +141,14 @@ void cache_read(const char *path)
}
/* C::B patch: Compatibility with 64 bit compiler / OS */
- #if defined(_WIN64)
- sscanf(buf, "%I64d %n", &timeval, &n);
+ #if (_USE_LONG_TIME_T)
+ sscanf(buf, "%ld %n", &timeval, &n);
#else
- sscanf(buf, "%lld %n", &timeval, &n);
+ #if defined(PRId64)
+ sscanf(buf, "%" PRId64 " %n", &timeval, &n);
+ #else
+ sscanf(buf, "%lld %n", &timeval, &n);
+ #endif
#endif
h = hdr_enter (buf + n);
h->time = timeval;
@@ -169,10 +176,14 @@ void cache_write(const char *path)
{
LIST *l;
/* C::B patch: Compatibility with 64 bit compiler / OS */
- #if defined(_WIN64)
- fprintf(f, "%I64d %s\n", h->time, h->file);
+ #if (_USE_LONG_TIME_T)
+ fprintf(f, "%ld %s\n", h->time, h->file);
#else
- fprintf(f, "%lld %s\n", h->time, h->file);
+ #if defined(PRId64)
+ fprintf(f, "%" PRId64 " %s\n", h->time, h->file);
+ #else
+ fprintf(f, "%lld %s\n", h->time, h->file);
+ #endif
#endif
for (l = h->includes; l; l = list_next (l))
{
diff --git a/src/plugins/compilergcc/depslib/src/hash.c b/src/plugins/compilergcc/depslib/src/hash.c
index 78823e43..57e00297 100644
--- a/src/plugins/compilergcc/depslib/src/hash.c
+++ b/src/plugins/compilergcc/depslib/src/hash.c
@@ -42,6 +42,9 @@
# include "jam.h"
# include "hash.h"
+/* C::B patch: Compatibility with 64 bit compiler / OS*/
+# include "inttypes.h" // PRId64
+
/* Header attached to all data items entered into a hash table. */
struct hashhdr {
@@ -266,8 +269,8 @@ hashstat( struct hash *hp )
#ifdef __LP64__ /* avoid warning on 64-bit machines */
printf( "%s table: %d+%d+%d (%dK+%luK) items+table+hash, %f density\n",
/* C::B patch: Compatibility with 64 bit compiler / OS*/
-#elif defined(_WIN64)
- printf( "%s table: %d+%d+%d (%dK+%I64dK) items+table+hash, %f density\n",
+#elif defined(PRId64)
+ printf( "%s table: %d+%d+%d (%dK+%" PRId64 "K) items+table+hash, %f density\n",
#else
printf( "%s table: %d+%d+%d (%dK+%dK) items+table+hash, %f density\n",
#endif
--
2.42.0.windows.2
--- End code ---
Navigation
[0] Message Index
Go to full version