apr-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Christian Gross <ChristianGr...@yahoo.de>
Subject Re: [PATCH] Type conversion needed for C++
Date Sun, 27 May 2001 13:32:29 GMT
On Sun, 27 May 2001 00:12:33 -0700, you wrote:

>Adding the cast just doesn't seem right. We implicitly cast void* to other
>things all the time. Why does *this* one break things? I just don't buy the
>need to do the cast.
>
I needed to cast, so that the C++ compiler would not barf on the
compilation.  Consider the following example.

void *func() {
	return (void *)NULL;
}

struct val {
	long something;
};

int main(int argc, char* argv[])
{
	struct val *tst;
	
	// Does not work
	tst = func();

	// Does work
	tst = (struct val *)func();
	return 0;
}

The C++ compiler will not accept the first cast.  In the
APR_IMPLEMENT_xxx macro there is a type cast from a void *
apr_array_make function to a known data type *pHook.  My C++ compiler
actually tells me to make the explicit cast.

Now why does the C++ compiler barf in cast scenario and not anywhere
else?  I was writing some basic hook code and it was written in a C++
program.  The APR_HOOK_xxx macros are being expanded in C++ code and
not C code.  Hence the APR_HOOK_xxx macros have to abide by C++
programming rules.

>Really... void* should be automatically castable to anything.
>
Maybe in C, but not C++.  As per the above example in C++ the cast
will not work.

>I'm guessing something more subtle is occurring, and the cast is simply
>hiding that subtlety.
>
I found the bug and then when I ran cpp to expand the macros found the
actual problematic line.

Christian

>Cheers,
>-g
>
>On Sat, May 26, 2001 at 06:12:38PM -0400, Christian Gross wrote:
>> On Sat, 26 May 2001 14:19:25 -0500, you wrote:
>> 
>> >I believe this would break type saftey.  These are very carefully constructed
to
>> >ensure that the proper hook fn is registered for the appropriate hook.
>> >
>> >I'll take a look at your patch later today and see what (if) it breaks anything,
>> >or if we were simply missing the "C" namespace wrappers.
>> >
>> The problem is that apr_array_push returns a void pointer.  And since
>> pHook is a predefined data type there is a type problem.  The extern
>> "C" wrappers only make the function behave using C linkage.  The code
>> within is still treated as C++.  I tried it and the same type cast
>> error still occured.
>> 
>> I think the only way to solve is this to use a type cast.  But correct
>> me if I am wrong.
>> 
>> Christian
>> 
>> >----- Original Message ----- 
>> >From: "Christian Gross" <ChristianGross@yahoo.de>
>> >Sent: Saturday, May 26, 2001 1:33 PM
>> >
>> >
>> >I was playing around with hooks and noticed that there is a problem
>> >with using hooks on C++.  The problem was that C++ does not allow a
>> >type conversion without a type cast.  Following is the fix
>> >
>> >---------------------------------------------------------------
>> >--- c:/httpd2_16/srclib/apr-util/include/apr_hooks.h Wed Apr  4
>> >01:35:46 2001
>> >+++ c:/httpd/srclib/apr-util/include/apr_hooks.h Sat May 26
>> >14:21:58 2001
>> >@@ -98,7 +98,7 @@
>> >
>> >_hooks.link_##name=apr_array_make(apr_global_hook_pool,1,sizeof(ns##_LINK_##name##_t));
>> >\
>> >  apr_hook_sort_register(#name,&_hooks.link_##name); \
>> >  } \
>> >-    pHook=apr_array_push(_hooks.link_##name); \
>> >+    pHook=(ns##_LINK_##name##_t *)apr_array_push(_hooks.link_##name);
>> >\
>> >     pHook->pFunc=pf; \
>> >     pHook->aszPredecessors=aszPre; \
>> >     pHook->aszSuccessors=aszSucc; \
>> >
>> >
>> >



Mime
View raw message