tags:

views:

117

answers:

4

I'm trying to use the OpenCA (libPKI) library in a C++ application. However, when including the file pki_x509_data_st.h the following code fragment is encountered:

typedef struct pki_x509_callbacks_st {

 /* ---------------- Memory Management -------------------- */
 void * (*new)  (void    );
 void   (*free) (void *x );
 void * (*dup)  (void *x );

This won't compile because of the "new" pointer declaration.

How can I make it work?

Update
After renaming the "new" variable I've encountered some new problems ("using typedef name after struct" etc.. ). I want to avoid changing too much of the old C code (modifying library headers somehow makes me feel nervous) so I decided just create a minimal isolation layer instead.

A: 

It's a reserved word in C++. Rename it to "myNew" or something.

Jim Buck
+3  A: 

If you can get away with it, rename it to something that's not a reserved word in C++. Chances that that you might end up having to rebuild the whole library and apply your "fix" there as well.

I'd be looking into constructing an isolation layer between your C++ code and the C library, potentially a bit of C code that only exposes the functions you need to use and completely isolate you from the rest.

Oh, and by the way - that's a function pointer declaration, not a variable declaration. Just to clear this up...

Timo Geusch
Is the function pointer not a variable in this case?
StackedCrooked
Yes - it's a variable of type 'pointer to function'.
Steve Fallows
+6  A: 
#define new its_reserved_dammit
#include <pki_x509_data_st.h>
#undef new

I suspect that the linker will be upset about it, though.

However, using a C library which isn't prepared for usage from C++, the linker will complain anyway, since the headers are missing the important extern "C" wrappers anyway...

sbi
Could the down-voter please explain what's wrong with my answer?
sbi
+4  A: 

Try this:

#define new mynew
extern "C"
{
#  include "pki_x509_data_st.h"
}
#undef new

What you should also do is change the file and submit a bug together with your patch.

Eddy Pronk