我的问题是关于何时应该用externC中的关键字引用函数.
我没有看到何时应该在实践中使用它.在我编写程序时,我使用的所有函数都通过我包含的头文件提供.那么为什么extern访问头文件中没有公开的东西会有用呢?
我可能会想到如何extern正确地工作,如果是这样,请纠正我.
编辑:如果extern是头文件中没有关键字的默认声明,你应该做些什么吗?
为什么我们需要使用:
extern "C" {
#include <foo.h>
}
特别:
我们什么时候应该使用它?
在编译器/链接器级别发生了什么,需要我们使用它?
如何在编译/链接方面解决了需要我们使用它的问题?
我有一个奇怪的链接器问题.我的代码看起来像这样:
    double given_amount = self.modelController.levelCompleteRewardAmount;
    swrve_currency_given(swrve, (CFStringRef)@"currencyName", given_amount);
我在两个不同的地方有这个代码:在objective-c和objective-c ++文件中.它在objective-C land中编译很好,但是swrve_currency_given()函数在我的WGController.mm文件中导致以下内容:
Undefined symbols for architecture armv7:
  "swrve_currency_given(Swrve*, __CFString const*, double)", referenced from:
      -[WGController giveTheUserSomeCashForPlayingThisLevel] in WGController.o
ld: symbol(s) not found for architecture armv7
collect2: ld returned 1 exit status
我不完全确定这个错误是否与Obj-C与C++有关,但感觉就像它.我的理论是它可能认为它是Obj-C类的一个函数?'swrve'代码是第三方代码,一个.h和.c文件,我像这样导入:
#import "swrve.h"
任何帮助表示赞赏!谢谢
我刚刚得到一些使用extern"C"的C代码来声明这样的外部函数:
extern "C" void func();
这是有效的C吗?我在这一行收到错误,但我不确定是不是因为这个或其他原因.
void foo(void) {}我有一个我希望内联的函数(让我们称之为它)。但是我在 .cpp 文件中定义了它。
我无法将该函数移动到标头,因为它正在使用 .cpp 中的其他函数。
 
编辑: 
下面的代码就像真实的代码一样不使用 C++ 功能。我可以明确补充:
#ifdef __cplusplus
extern "C"
#endif
如果我想将下面的代码转换为 c99,我只需要更改我的项目属性(或 makefile,如果您愿意)而不是代码。我也在询问c++,因为它可以解决我的问题,而c99不能。
因此我的问题中的 C 和 C++ 标签是合理的。代码是可移植的, 
 
请参阅:When to use extern "C" in C++?
 
编辑#2 
好吧,我明白我必须将foo()定义放在头文件中。如何在不将它们移动到头文件的情况下调用func_a()和func_b()from ?foo()有什么解决方法吗?
 
示例
文件.c/.cpp:
int    func_a (int a,    int b,    int c)    {/*...*/};
double func_b (double a, double b, double c) {/*...*/};
void   foo    (int a, double b) { // unction definition
    //...
    int myInt …我读过了
但是,我还没有找到答案的一个问题:使用extern "C"(例如,尽可能多的函数)是否存在(可能,未来)缺点?
更具体一点:添加extern "C"接口仅使用C功能的函数是否有任何缺点; 换句话说,那些不使用@ k-five答案中列出的功能的人?
我想制作一个自动包装C库的工具:
#ifdef __cplusplus
extern "C" {
#endif
但我迷茫了什么究竟需要与包裹extern "C",什么不需要。只有功能吗?任何(shock-horror)全局变量呢?还要别的吗?
如果我编写一个脚本来查找所有函数并用 包装它们extern "C",这样就足够了吗?
最后:如果库已经用它包装了它的函数,extern "C"然后它们又被包装了,我能相信没有什么不好的事情发生并且它仍然可以正常工作,还是我需要明确检查这个?