Building on Windows from scratch - difftime problem found ( was datediff )
jralls at ceridwen.us
Sat Jan 25 12:34:39 EST 2014
On Jan 25, 2014, at 8:09 AM, Gary Bilkus <mail at gary.bilkus.com> wrote:
> On 25/01/2014 15:37, John Ralls wrote:
>> On Jan 25, 2014, at 5:49 AM, Gary Bilkus <mail at gary.bilkus.com> wrote:
>>> On 24/01/2014 17:08, Derek Atkins wrote:
>>>> John Ralls <jralls at ceridwen.us> writes:
>>>>> if (sizeof(time_t) == 8)
>>>>> return (double)((int64)time1 - (int64)time2);
>>>>> return (double)((int32)time1 - (int32)time2);
>>>> This code probably wouldn't compile cleanly. It would complain about
>>>> casting to different sizes. Even though theoretically the compiler
>>>> should be able to optimize the branch by noticing that it is always true
>>>> or always false, it will still complain about the unused branch. (I
>>>> know this from personal experience).
>>>>> That could be done as a macro and inserted into one of the header
>>>>> files in each library.
>>>>> John Ralls
>>> Given that time_t is always a signed integer value, wouldn't
>>> return (double)(time1-time2)
>>> just work anyway, at least as far as a patch for mingw is concerned?
>> Only if the binary never leaves the machine on which it was compiled. The problem arises when the program compiled with one size of time_t is run with an msvcrt with the other size. Keith Mashall explains it pretty clearly in the second and third emails in that thread I cited a couple of days ago.
>> John Ralls
> Hold on though. These solutions don't call MSVCRT at all, so why does that matter? And if it did, why would your solution work anyway, given that sizeof is evaluated at compile time? (leaving aside Derek's point that it might not compile cleanly.
> It seens that trying to find a way of guaranteeing to call the right version of MSVCRT correctly is way harder than just getting the correct result!
Yes, the sizeof() hack was a dumb idea.
One normally gets a time_t from an msvcrt function call, so msvcrt is involved regardless. Marshall offers a pretty complex patch with lots of casts, and he certainly knows the ins and outs better than I. Perhaps you should ask him.
It looks to me that always defining _USE_32_BIT_TIME_T might work, though you might have to make that conditional on Vista-or-later. Have you tested that?
More information about the gnucash-devel