是否有一种内联方式来混合使用c和c ++原型?

cha*_*m15 10 c c++

我想要一种内联方式来指定哪些原型应该包含在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)

  • 除了卡尔的答案不涉及'extern C'命名空间.然后,无法从C++调用纯c函数. (2认同)

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的回答显示了一种可能的方式.