stdcxx-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Martin Sebor <se...@roguewave.com>
Subject Re: macro function override for rw_assert() function?
Date Fri, 18 Apr 2008 20:50:32 GMT
Travis Vitek wrote:
>  
> 
>> Martin Sebor wrote:
>>
>> Eric Lemings wrote:
>>>  
>>> Is there an macro function (or similar macro function) that calls the
>>> rw_assert() function automatically passing it the __FILE__ 
>>> and __LINE__ arguments?
>> Unfortunately, there isn't. No. rw_assert() is a variable
>> argument function and since C99 varargs macros haven't been
>> introduced into C++ yet not all compilers support them.
>>
> 
> Unless I'm misunderstanding what we are talking about, it seems that we
> can get around that pretty easily..

But that's C++! ;-) No, seriously, I like it.

IMO, the biggest problem with the printf-like interface is
that it's error-prone. It would be nice to be able to just
pass in the arguments w/o having to worry about getting
the directives right, but that would require quite a bit
of code in the rwtest headers and wouldn't be namespace
clean.

Martin

> 
>   // in driver.h
>   struct rw_diag_obj
>   {
>     rw_diag_obj (diag_t diag, const char* file, int line)
>         : diag_(diag), file_(file), line_(line) { }
> 
>     // implemented in driver.cpp
>     bool operator()(int success, const char* fmt, ...);
> 
>     const diag_t diag_;
>     const char const* file_;
>     const int line_;
>   };
> 
>   // someone will probably want to select better names
>   #define rw_fatal_x  rw_diag_obj(diag_fatal , __FILE__, __LINE__)
>   #define rw_error_x  rw_diag_obj(diag_error , __FILE__, __LINE__)
>   #define rw_assert_x rw_diag_obj(diag_assert, __FILE__, __LINE__)
>   #define rw_warn_x   rw_diag_obj(diag_warn  , __FILE__, __LINE__)
>   #define rw_note_x   rw_diag_obj(diag_note  , __FILE__, __LINE__)
> 
>   // in driver.cpp
>   bool rw_diag_obj::operator()(int success, const char* fmt, ...)
>   {
>       va_list va;
>       va_start (va, fmt);
> 
>       _rw_vdiag (diag_, 0 == success, file_, line_, fmt, va);
> 
>       va_end (va);
> 
>       return success;
>   }
> 
> There might be a small amount of overhead to do this, but it should be
> optimized in most cases.
> 
> Travis
> 
>> Martin
>>


Mime
View raw message