c在c++实践中的应用

c in c++ practices

本文关键字:应用 实践中 c++      更新时间:2023-10-16

我通常不会这么做,但我目前正在处理的项目需要c源文件中的几个函数。

extern "C" {
    int words(char sentence[]);
    int match(char str[], char sentence[], int n);
}

我只是想知道,将这些原型添加到c中的链接函数的最佳位置在哪里?

它应该添加到c++源文件(在我的例子中是command.cpp)还是添加到c/c++头?(command.h)

最不容易出错的方法是将声明放在共享的C&C++头文件,#ifdef是仅由C++编译器使用的extern "C" {(这是C中的语法错误):

#ifdef __cplusplus
extern "C" {
#endif
  int words(char sentence[]);
  int match(char str[], char sentence[], int n);
#ifdef __cplusplus
}
#endif

我个人也喜欢pre-#为无范围的extern语法定义宏的变体:

#ifdef __cplusplus
#define CFUN extern "C"
#else
#define CFUN
#endif
CFUN int words(char sentence[]);
CFUN int match(char str[], char sentence[], int n);

这使混乱的#ifdef内容保持本地化。您可以将它放在一个项目范围的头文件中,并在任何位置使用CFUN说明符。如果CFUN宏的名称可能与现有定义冲突,则可能需要将其作为前缀。

标准的习惯用法是您的头使用C++定义的__cplusplus宏。因此,如果你的C翻译单元在file.c中有实现,那么你会把标题file.h写如下:

#ifndef H_FILE
#define H_FILE
#ifdef __cplusplus
extern "C" {
#endif
int words(char sentence[]);
int match(char str[], char sentence[], int n);
#ifdef __cplusplus
}  // extern "C"
#endif
#endif  // include guard

现在,您可以在C和C++翻译单元中使用相同的标题。

因为它们是函数原型,所以声明与C++中的标准相同。您应该将它们添加到头文件中。除非我完全误解了你的问题。

我会将它们放在cpp文件中,与您通常放置正向声明的位置相同。如果在多个cpp文件中使用它们,请考虑标头。只有这样。

当然,在头文件中是一个加分项!但是ifdef应该用来避免多重定义。但在你的情况下,这不是问题所在。