我想要一种内联方式来指定哪些原型应该包含在c ++中.例如:
void ArrayList_insert(ArrayList *arrlst, void *data, int i);
IS_CPP void ArrayList_insert(ArrayList *arrlst, char *data, int i);
IS_CPP void ArrayList_insert(ArrayList *arrlst, Buffer *data, int i);
目前我在做:
#ifdef __cplusplus
extern "C" {
#endif
....C HEADERS..
#ifdef __cplusplus
}
....C++ HEADERS...
#endif
但它非常不方便,因为相同功能的重载在不同的地方.我可以只有两个不同的头文件,但这也很痛苦.因此,我正在寻找像我上面提出的内联解决方案.有谁知道这样做的方法?
Mar*_*ata 14
它比你想象的容易.
#ifdef __cplusplus
#define IS_C(x) extern "C" x ;
#define IS_CPP(x) x ;
#else
#define IS_C(x) x ;
#define IS_CPP(x)
#endif
Run Code Online (Sandbox Code Playgroud)
使用这种类型的标题:
IS_C (void ArrayList_insert(ArrayList *arrlst, void *data, int i))
IS_CPP (void ArrayList_insert(ArrayList *arrlst, char *data, int i))
IS_CPP (void ArrayList_insert(ArrayList *arrlst, Buffer *data, int i))
Run Code Online (Sandbox Code Playgroud)
Car*_*rum 11
当然,通过使用类似函数的宏,你几乎可以像你的例子那样做:
#ifdef __cplusplus
#define IS_CPP(x) x
#else
#define IS_CPP(x)
#endif
void ArrayList_insert(ArrayList *arrlst, void *data, int i);
IS_CPP(void ArrayList_insert(ArrayList *arrlst, char *data, int i));
IS_CPP(void ArrayList_insert(ArrayList *arrlst, Buffer *data, int i));
Run Code Online (Sandbox Code Playgroud)
现在,如果您将头文件编译为C++,您将获得所有三个,但如果您编译为C,则只能获得一个.如果要在两者之间共享一个库,则extern "C"在编译C++时需要向C函数添加一些限定符.@MarkLakata的回答显示了一种可能的方式.