У меня есть заголовок, который я хочу включить из .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 и включении его в эти 2 места … но есть ли что-то простое, что мне не хватает?
Да, есть лучший способ. Люди обычно делают это:
#ifdef __cplusplus
extern "C"{
#endif
int isPrime(int64_t p);
#ifdef __cplusplus
}
#endif
Если вы хотите сделать что-то другое в C и C ++ (как, например, этот) тогда вы можете использовать второй синтаксис в вашем вопросе.
Другой способ сделать это заключается в следующем
// 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
Обычно часть «intro» помещается в общий заголовочный файл, который может использовать каждый.
Преимущество этого формата заключается в том, что каждое объявление сразу рассматривается как extern "C"
, Читатель не должен искать вокруг возможного extern "C" {
#ifdef __cplusplus
extern "C"{
#endif
int isPrime(int64_t p);
#ifdef __cplusplus
}
#endif
Таким образом, вы можете продлить int isPrime(int64_t p);
часть произвольно, не повторяя это в вашем #ifdef
а также #else
случаев.