--- James Dennett <[EMAIL PROTECTED]> wrote:
> Joe Wilson wrote:
> > The proposed expression ((sqlite3_destructor_type)-1) is equivalent to
> > ((void(*)(void *))-1). They are interchangable.
> 
> Not in C++.  The difference being linkage; with the typedef declared in
> an extern "C" block, the type is something that can't be written
> directly.

Now I understand your confusion. SQLite is a C. All its API definitions in 
sqlite3.h and its function pointers are obviously C-based. So to avoid these 
warnings related to using SQLITE_TRANSIENT (or SIG_ERR for that matter)
in your C++ code, your C++ implementation file must do the following:

// example.cpp
#include "sqlite3.h"
extern "C" {
  void example(sqlite3_context* c, const char* b, int n) {
    sqlite3_result_text(c, b, n, SQLITE_TRANSIENT);
  }
  // you can even put class member function implementations in here
  // i.e., void Foo::bar() {...}
  // without affecting their C++ linkage.
}

You'll find that it compiles in Sun C++ 5.8 2005/10/13 without warnings 
using the unmodified sqlite3.h file. 

The C++ code does not need the proposed typedef to handle SQLITE_TRANSIENT, 
although if it were added to sqlite3.h it would not do any harm, and you 
might be able to avoid the extern "C" block around your sqlite-related 
function implementations.

> >   #define SIG_IGN (void(*)(int))1
> >   #define SIG_ERR (void(*)(int))-1
> > 
> > Such C code is grandfathered in C++. If it wasn't you wouldn't be able
> > to do any UNIX systems programming in C++.
> 
> It's not portable C, and it's not portable C++.  It does seem to be
> blessed by POSIX, but POSIX is just a subset of the much larger range of
> platforms supported by ISO/ANSI C and C++.

In your original question you asked:

 On a related but separate note, is there any standard that guarantees
 that casting -1 to a function pointer type is reasonably portable?

And yes, it is reasonably portable as shown by every UNIX variant that 
must deal with POSIX and every major C++ compiler vendor, as a consequence. 
That's good enough for me. It may or may not be blessed by the C++ standard,
but if you can dig up a modern popular C++ compiler that does not work with
such code, I'd be surprised.



 
____________________________________________________________________________________
The fish are biting. 
Get more visitors on your site using Yahoo! Search Marketing.
http://searchmarketing.yahoo.com/arp/sponsoredsearch_v2.php

-----------------------------------------------------------------------------
To unsubscribe, send email to [EMAIL PROTECTED]
-----------------------------------------------------------------------------

Reply via email to