2

我有一个要包含在 .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的标题并将其包含在这两个地方......但是我缺少一些简单的东西吗?

4

3 回答 3

6

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

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

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

于 2013-11-02T21:38:10.480 回答
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" {

于 2013-11-02T21:46:06.247 回答
1
#ifdef __cplusplus
    extern "C"
    {
 #endif
        int isPrime(int64_t p);
#ifdef __cplusplus
    }
 #endif

这样,您可以任意扩展该部分,而无需在您的 情况int isPrime(int64_t p);下重复它。#ifdef#else

于 2013-11-02T21:38:23.280 回答