我正在开发一个包含大量遗留C代码的项目.我们已经开始用C++编写,目的是最终转换遗留代码.我对C和C++的交互方式有点困惑.我知道通过使用C++编译器包装C代码extern "C"不会破坏C代码的名称,但我不完全确定如何实现它.
因此,在每个C头文件的顶部(在包含警卫之后),我们有
#ifdef __cplusplus
extern "C" {
#endif
Run Code Online (Sandbox Code Playgroud)
在底部,我们写
#ifdef __cplusplus
}
#endif
Run Code Online (Sandbox Code Playgroud)
在两者之间,我们拥有所有的includes,typedef和函数原型.我有几个问题,看看我是否理解正确:
如果我有一个C++文件A.hh,其中包含一个C头文件Bh,包含另一个C头文件Ch,这是如何工作的?我认为当编译器进入Bh时,
 __cplusplus将被定义,因此它将包装代码extern "C"
(并且__cplusplus不会在此块内定义).因此,当它进入Ch时,
 __cplusplus将不会定义并且代码将不会被包装
 extern "C".它是否正确?
包装一段代码有什么问题
 extern "C" { extern "C" { .. } }吗?第二个会extern "C"
做什么?
我们不把这个包装器放在.c文件周围,只放在.h文件中.那么,如果函数没有原型会发生什么?编译器是否认为它是C++函数?
我们还使用了一些用C语言编写的第三方代码,并没有这种包装.每当我从该库中包含一个标题时,我就一直extern "C"在使用#include.这是处理这个问题的正确方法吗?
最后,这是一个好主意吗?还有什么我们应该做的吗?我们将在可预见的未来混合C和C++,我想确保我们覆盖所有基础.
在我的存储库中,我远程跟踪我们的主存储库,这是裸的.我从来没有遇到从过去取得的任何问题.
但是,当我今天早上尝试远程更新时,我收到以下错误:
fatal: '/users/integrator/project' does not appear to be a git repository
fatal: The remote end hung up unexpectedly
error: Could not fetch origin
Run Code Online (Sandbox Code Playgroud)
我没有改变任何东西,存储库肯定还在那里.有几个人可以访问集成商帐户,但他们通常会合并和拉取.我们不允许推送到此存储库.
我的问题是:可能导致这种情况发生的原因是什么?或者,是否有任何诊断我可以用来弄清楚出了什么问题?我不是唯一突然遇到此问题的用户,所以问题更可能是在原点方面.
更新:
当我尝试克隆裸存储库时,我收到以下错误:
git clone /users/integrator/project
Cloning into project...
fatal: failed to open '/users/integrator/project/.git/objects': No such file or directory
Run Code Online (Sandbox Code Playgroud)
这是/ users/integrator/project的内容列表:
config
HEAD
packed-refs
ssh_helper
bin/
hooks/
info/
  exclude
objects/
  [lots of folders with two character long names]
  info/
  pack/
refs/
  heads/
  tags/
Run Code Online (Sandbox Code Playgroud)