On Sep 8, 2014, at 11:16 AM, Christian Stimming <christ...@cstimming.de> wrote:
> Am Montag, 8. September 2014, 07:17:47 schrieb John Ralls: >> On Sep 8, 2014, at 5:31 AM, Christian Stimming <christ...@cstimming.de> > wrote: >>> Zitat von John Ralls <jra...@ceridwen.us>: >>>>> recently I noticed the "trans-retrieval" slot in the aqbanking account >>>>> doesn't remember its value. >>>> >>>> Christian, >>>> >>>> Yeah, fixed and pushed, e210f8c. >>>> >>>> The difference was that your test used the defective accessor function >>>> and mine used qof_instance_get directly with the right parameter type >>>> (Timespec ** instead of Timespec *).> >>> Ah, the wonders of zero compile-time checks of variable argument lists in >>> C... >>> >>> Thanks a lot for fixing this! >> >> It's not C's fault; C compiler's know the difference between pointers and >> pointers-to-pointers and how to raise type errors. It's GValue's conversion >> of everything to void* that defeats the type checking. > > Err... no, it is indeed C's fault: The function in question, qof_instance_get > and set, uses a variable argument list (variadic arguments), terminated by > the > NULL pointer in the call, and this variable arguments are not at all compile- > time checked. Using qof_instance_get is what you inserted here in > 272655b60c0e30726, including the bug you fortunately now fixed. If there is > another interface that gives us some more compile time checking, feel free to > propose it here and/or in the docs of qof_instance_get. Or is this just a > fundamental (bad) property of g_object's property system that we can't avoid? It’s a fundamental bad property of variadic functions in general, but if the variadic function was calling a strongly-typed function (inside GObject, since qof_instance_get just wraps g_object_get) the compiler would have errored out. Since the GValue functions take void*, the compiler didn’t have a chance. The interface which gives more compile-time checking uses templates instead of void*, at the expense of some really horrendous compiler error messages. Boosters of the new concepts feature due in C++17 and available in boost claim that it fixes the compiler error problem, but I haven’t tried it yet to see if they’re right. I think replacing GObject properties and GValues will be part of converting the primary database classes to C++. Regards, John Ralls _______________________________________________ gnucash-devel mailing list gnucash-devel@gnucash.org https://lists.gnucash.org/mailman/listinfo/gnucash-devel