Tag: extern c

extern“C”和简单extern 之间的区别

我已经看到C / C ++代码使用在函数签名中声明的extern“C”,并且还包括将C头包含到CPP文件中。 但有些函数只是在签名之前声明extern(没有“C”)。 QN1: 这两种定义函数的方式是否具有相同的效果,还是它们意味着不同的东西? 对不起,如果我很傻,但我无法通过谷歌找到这种差异。 例如: extern int someFunction( void *ret_val); extern “C” int someFunction( void *ret_val); QN2: 如果函数在其签名中声明了extern,那么相应的头文件是否必须包含在extern“C”块中? 正如评论中的另一个用户所指出的那样,标记的副本并不完全满足此处的问题。 我正在编辑,以便将来其他人可能不会误导成另一个问题。

extern和extern“C”表示变量

我正在编写一个C ++共享库供C程序使用。 但是,我有一个关于extern和extern “C” 。 请考虑以下代码 我的头文件是这样的: #ifdef __cplusplus extern “C” int global; extern “C” int addnumbers(int a, int b); #else extern int global; #endif 这完美无缺; 我只需要申报 int global; 在我的.cpp或我的.c文件中。 但是,我不明白的是: extern “C”和extern在这里有什么区别? 我尝试评论extern “C” int global并且它有效! 为什么? 我知道extern “C”用于制作C链接。 这就是为什么我有extern “C” int addnumbers(int,int) 。 换句话说,如果我想编写一个将在C程序中使用的C ++函数,我会编写extern “C” 。 现在,全球变量怎么样 – 我猜这里的情况有所不同? 我希望C程序使用名为global的C ++变量,但我可以使用extern而不是extern “C” […]

extern“C”对C有影响吗?

我刚刚得到一些使用extern“C”的C代码来声明这样的外部函数: extern “C” void func(); 这是有效的C吗? 我在这一行收到错误,但我不确定是不是因为这个或其他原因。

是否可以在C ++中子类化C结构并在C代码中使用指向结构的指针?

这样做是否有副作用: C代码: struct foo { int k; }; int ret_foo(const struct foo* f){ return fk; } C ++代码: class bar : public foo { int my_bar() { return ret_foo( (foo)this ); } }; C ++代码周围有一个extern “C” ,每个代码都在自己的编译单元中。 这可以跨编译器移植吗?

我们可以在没有#ifdef __cplusplus的C文件中使用extern“C”吗?

为什么不应该为需要定义为C函数的函数指定extern “C” ? 将文件编译为C源时,对编译器有什么影响? 如果对C编译器没有影响,我们#ifdef __cplusplus删除#ifdef __cplusplus检查来在头文件中定义一个函数,如下所示: extern “C” { int MyFunc(); } 对另一个问题的回答说需要#ifdef ,但我不明白为什么: 关于#2:将为正在通过C ++编译器运行的任何编译单元定义__cplusplus。 通常,这意味着.cpp文件和该.cpp文件包含的任何文件。 如果不同的编译单元包含它们,则相同的.h(或.hh或.hpp或what-have-you)可以在不同时间被解释为C或C ++。 如果您希望.h文件中的原型引用C符号名称,那么它们在被解释为C ++时必须具有extern “C” ,并且在被解释为C时它们不应该具有extern “C” – 因此#ifdef __cplusplus检查。

什么时候用简单的单词使用extern“C”?

也许我不理解C和C ++之间的差异,但是我们何时以及为什么需要使用它 extern “C” { ? 显然它是一个“联系会议”。 我简单地阅读了它,并注意到MSVS中包含的所有.h头文件都包含它们的代码。 什么类型的代码到底是“C代码”而不是“C ++代码”? 我以为C ++包含了所有的C代码? 我猜这不是这种情况,C ++是不同的,标准特性/function存在于一个或另一个中,但不是两个(即:printf是C和cout是C ++),但是C ++是向后兼容的,尽管外部“C”声明。 它是否正确? 我的下一个问题取决于第一个问题的答案,但无论如何我会在这里问:由于用C语言编写的MSVS头文件被extern“C”{…}包围,你什么时候需要使用它你自己的代码? 如果您的代码是C代码并且您正在尝试在C ++编译器中编译它,那么它是否应该没有问题,因为您包含的所有标准h文件在C ++编译器中已经有了外部“C”的东西? 在C ++中编译但是链接到已经构建的C库或其他东西时,你是否必须使用它?

为什么C ++函数的C ++回调需要“extern C”?

我在Boost代码中找到了这样的例子。 namespace boost { namespace { extern “C” void *thread_proxy(void *f) { …. } } // anonymous void thread::thread_start(…) { … pthread_create(something,0,&thread_proxy,something_else); … } } // boost 为什么你真的需要这个extern “C” ? 很明显, thread_proxy函数是私有内部的,我不认为它会被破坏为“thread_proxy”,因为我实际上根本不需要它。 事实上,在我编写的所有代码中,我在许多平台上运行,我从未使用过extern “C” ,这与普通函数一样。 为什么添加了extern “C” ? 我的问题是extern “C”函数污染了全局命名空间,它们实际上并没有像作者所期望的那样被隐藏。 这不是重复的! 我不是在谈论破坏和外部联系。 在这段代码中很明显,外部链接是不需要的! 答: C和C ++函数的调用约定不一定相同,因此您需要使用C调用约定创建一个。 参见C ++标准的7.5(p4)。

何时在C ++中使用extern“C”?

可能重复: 为什么我们需要在C ++中使用extern“C”{#include }? 我经常看到程序编码如下: extern “C” bool doSomeWork() { // return true; } 为什么我们使用extern “C”块? 我们可以用C ++中的东西替换它吗? 使用extern “C”有什么好处吗? 我确实看到一个解释这个的链接但是为什么我们需要在已经有C ++的情况下用C语言编译?

函数声明只需要extern“C”吗?

我写了一个C ++函数,我需要从C程序调用。 为了使它可以从C调用,我在函数声明中指定了extern “C” 。 然后我编译了C ++代码,但编译器(Dignus Systems / C ++)为该函数生成了一个错位的名称 。 所以,它显然没有尊重extern “C” 。 为了解决这个问题,我在函数定义中添加了extern “C” 。 在此之后,编译器生成了一个可从C调用的函数名。 从技术上讲,只需要在函数声明中指定extern “C” 。 这是正确的吗? ( C ++ FAQ Lite就是一个很好的例子。)你是否还要在函数定义中指定它? 这是一个certificate这一点的例子: /* ———- */ /* “foo.h” */ /* ———- */ #ifdef __cplusplus extern “C” { #endif /* Function declaration */ void foo(int); #ifdef __cplusplus } #endif /* […]

外部“C”声明如何工作?

我正在学习编程语言课程,我们正在讨论extern “C”声明。 除了“它接口C和C ++”之外,这个声明如何在更深层次上工作? 这又如何影响程序中发生的绑定?