incubator-stdcxx-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Martin Sebor <se...@roguewave.com>
Subject Re: svn commit: r668225 - /stdcxx/branches/4.3.x/etc/config/src/VA_LIST_FUNC_MACRO.cpp
Date Mon, 23 Jun 2008 23:26:31 GMT
Eric Lemings wrote:
>  
> 
>> -----Original Message-----
>> From: Travis Vitek [mailto:Travis.Vitek@roguewave.com] 
>> Sent: Monday, June 23, 2008 4:59 PM
>> To: dev@stdcxx.apache.org
>> Subject: RE: svn commit: r668225 - 
>> /stdcxx/branches/4.3.x/etc/config/src/VA_LIST_FUNC_MACRO.cpp
>>
>>  
>>
>>> Eric Lemings wrote:
>>>
>>>> Martin Sebor wrote:
>>>>
>>>>
>>>> My point was that I couldn't find a way to use a feature
>>>> that depends on variadic macros on platforms where they
>>>> are not supported. In other words, I can't picture what
>>>> the #else branch below would look like:
>>>>
>>>>    #ifndef _RWSTD_NO_VARIADIC_MACROS
>>>>    #  define RW_ASSERT(expr, ...) \
>>>>              rw_assert (expr, 0, __LINE__, __VA_LIST__)
>>>>    #else
>>>>    #  define RW_ASSERT(expr, ???) ...
>>>>    #endif
>>> You're right.  There is no backward-compatible workaround which
>>> essentially rules out using variadic macros in these cases.

Which is why I don't think we'll be able to (or need to) use the
config macro in our code.

>>>
>> I think I've showed this trick before, but it won't work with template
>> parameters, only function parameters.

Right. This "trick" obviates the need for variadic macros in the
case of the rw_xxx() functions.

(Note that the trick isn't a general replacement for variadic macros
because it relies on a runtime mechanism while variadic macros are
a compile-time one.)

>>
>>   struct Variadic
>>   {
>>       void operator()(const char* fmt, ...);
>>   };
>>
>>   #define VARIADIC Variadic().operator()
>>
>> Of course you would use it like this...
>>
>>   VARIADIC("hello %s", "world!");
> 
> Had forgotten about that.  :)
> 
> So, we have something like this:

There's no need for the additional complexity when we can just use
the #else case unconditionally. The !_RWSTD_NO_VARIADIC_MACROS case
provides no advantage over the workaround.

> 
> 	#ifndef _RWSTD_NO_VARIADIC_MACROS
> 	#  define RW_ASSERT(expr, ...) \
> 	          rw_assert (expr, 0, __LINE__, __VA_LIST__)
> 	#else
> 	struct __rw_assert {
> 	    int operator()(int expr, const char* file, int line,
> 	                   const char* fmt, ...) {
> 	        va_list va;
> 	        va_start (va, fmt);
> 	        _rw_vdiag (diag_assert, 0 == expr, file, line, fmt, va);
> 	        va_end (va);
> 	        return success;
> 	    }
> 	};
> 	#  define RW_ASSERT __rw_assert().operator()
> 	#endif
> 
> That pretty close?
> 
> And why is there a 2nd parameter in rw_assert() if its never used?  :P
> 
> Brad.


Mime
View raw message