如何布局将C与C ++混合的函数原型

时间:2013-11-02 21:35:46

标签: c++ c name-mangling extern-c

我有一个标题,我想要包含.c和.cpp文件。

所以我知道名字错误和外部“C”所以......

#ifdef __cplusplus
extern "C"
{
    int isPrime(int64_t p);
}
#endif

但当我在.c文件中包含它时,由于#ifdef __cplusplus

,它看不到该函数

所以我最终制作了2份副本:

 #ifdef __cplusplus
    extern "C"
    {
        int isPrime(int64_t p);
    }
 #else
     int isPrime(int64_t p);
 #endif

有没有更好的方法来做到这一点...我想要制作另一个名为prototypes.h的标题,并将其包括在那两个地方......但是我有什么简单的遗漏吗?

3 个答案:

答案 0 :(得分:6)

是的,还有更好的方法。人们通常这样做:

#ifdef __cplusplus
extern "C"
{
#endif
    int isPrime(int64_t p);
#ifdef __cplusplus
}
#endif

如果你想在c和c ++中做一些不同的事情(例如this),那么你可以在你的问题中使用第二种语法。

答案 1 :(得分:6)

另一种方法如下

// intro
#ifdef __cplusplus
#define EXTERN_C extern "C"
#else
#define EXTERN_C
#endif

// content
EXTERN_C int isPrime(int64_t p);
// many other functions declared with EXTERN_C

通常情况下,“介绍”部分放在一些常用的头文件中供大家使用。

此格式的优点是每个声明都会立即显示为extern "C"。读者无需搜索可能的extern "C" {

答案 2 :(得分:1)

#ifdef __cplusplus
    extern "C"
    {
 #endif
        int isPrime(int64_t p);
#ifdef __cplusplus
    }
 #endif

这样,您可以在int isPrime(int64_t p);#ifdef个案例中随意扩展#else部分,而无需重复{。}}。