开发者

Including a C header which declares a variable called "new"?

开发者 https://www.devze.com 2022-12-27 21:59 出处:网络
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:

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 stru开发者_运维百科ct 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.


#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...


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.


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...


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

0

精彩评论

暂无评论...
验证码 换一张
取 消