Как сделать макет функции Prototypes смешивая 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 и включении его в эти 2 места … но есть ли что-то простое, что мне не хватает?

2

Решение

Да, есть лучший способ. Люди обычно делают это:

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

Если вы хотите сделать что-то другое в C и C ++ (как, например, этот) тогда вы можете использовать второй синтаксис в вашем вопросе.

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

Обычно часть «intro» помещается в общий заголовочный файл, который может использовать каждый.

Преимущество этого формата заключается в том, что каждое объявление сразу рассматривается как extern "C", Читатель не должен искать вокруг возможного extern "C" {

6

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

Таким образом, вы можете продлить int isPrime(int64_t p); часть произвольно, не повторяя это в вашем #ifdef а также #else случаев.

1
По вопросам рекламы [email protected]