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

Gra*_*yer 2 c c++ name-mangling extern-c

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

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

#ifdef __cplusplus
extern "C"
{
    int isPrime(int64_t p);
}
#endif
Run Code Online (Sandbox Code Playgroud)

但是当我在.c文件中包含它时,由于它没有看到该函数 #ifdef __cplusplus

所以我最终制作了2份:

 #ifdef __cplusplus
    extern "C"
    {
        int isPrime(int64_t p);
    }
 #else
     int isPrime(int64_t p);
 #endif
Run Code Online (Sandbox Code Playgroud)

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

BЈо*_*вић 6

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

#ifdef __cplusplus
extern "C"
{
#endif
    int isPrime(int64_t p);
#ifdef __cplusplus
}
#endif
Run Code Online (Sandbox Code Playgroud)

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


n. *_* m. 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
Run Code Online (Sandbox Code Playgroud)

通常,"intro"部分放在一些公共头文件中供大家使用.

这种格式的优点是每个声明都被立即视为extern "C".读者不必四处寻找可能extern "C" {