静态VS外部的“C” /“C ++”
-
09-09-2019 - |
题
是什么的静态成员函数和一个extern“C”联动功能之间的差异?例如,在C ++中使用“makecontext”时,我需要通过一个指针运行。谷歌建议使用它的extern“C”链接,因为“makecontext”是C.但我发现,使用静态的作品也是如此。我只是幸运还是...
class X {
public:
static void proxy(int i) {}
}
makecontext(..., (void (*)(void)) X::proxy, ...);
VS
extern "C" void proxy(int i) {}
makecontext(..., (void (*)(void)) proxy, ...);
编辑:你能告诉编译器或体系结构,其中的静态成员的版本不工作(和它不是在编译器中的错误)
解决方案
是的,你只是幸运:)器extern“C”是每一个C ++编译器,支持C语言的一种语言联动,旁边的extern“C ++”,这是默认的。编译器可能支持其他语言的联系。 GCC例如支持外部的“Java”的,它允许使用Java代码的接口(虽然这是相当麻烦的)。
的extern“C”告诉编译器的功能是通过C代码调用。可以,但不是必须,包括适当的调用约定和中视执行其他的事情适当的C语言的名称重整(有时称为“装饰”)。如果你有一个静态成员函数,它的调用约定是C ++编译器的一个。他们往往是一样针对该平台的C编译器 - 所以我说你是幸运罢了。如果你有一个C API,你传递一个函数指针,更好地总是把一个与外部的“C”状
声明的函数extern "C" void foo() { ... }
尽管函数指针类型不包含链接说明而是看起来像
void(*)(void)
的关联是类型的一个组成部分 - 你不能直接没有一个typedef表达它:
extern "C" typedef void(*extern_c_funptr_t)();
在科莫C ++编译器,在严格模式,将如果尝试的上述外部的“C”函数的地址分配给一个(void(*)())
发出例如一个错误,beause这是一个指向与C ++链接的函数。
其他提示
请注意,这是extern C
的推荐强> C / C ++的互操作性的方法。 这里是主人谈论它。为了增加eduffy的回答是:注意在全局命名空间静态函数和变量已被弃用。至少使用匿名的命名空间。
返回extern C
:如果你不使用外部C你必须知道确切的重整名称,并使用它。即变成一种痛苦的。
extern "C"
禁用C ++编译器的名称重整(这是需要的过载)。
如果声明在A.cpp函数即可static
,那么它不能被发现B.cpp(它是从剩余的C,并且它具有把一个功能的匿名命名空间内的相同的效果)。
大多数extern "C"
做什么在很大程度上依赖于编译器。许多平台更改名称重整,并要求根据关申报惯例,而是由标准没有指定的那个。真正的标准要求的唯一事情是,在块中的代码是从C函数调用。至于你的具体问题,标准的说:
两种功能类型的具有不同 语言的联系是不同的类型 即使它们是其它方面相同。
这意味着extern "C" void proxy(int i) {}
和/*extern "C++"*/void proxy(int i) {}
有不同的类型,并且作为结果的指针这些功能将具有不同类型的为好。编译器不会失败你的代码出于同样的原因,将不会失败很大的一块工作,如:
int *foo = (int*)50;
makecontext(..., (void (*)(void)) foo, ...);
此代码可能会在某些平台上工作,但这并不意味着它会在其他平台上(即使编译器是完全符合标准的)工作。你正在你的特定平台是如何工作的优势,这可能是,如果你不关心编写移植代码确定。
作为用于静态成员函数,它们并不需要具有this
指针,以便编译器可以自由地把它们作为非成员函数。同样,这里的行为是平台特定的。
一般而言
<强>存储类:强>
存储类用于指示变量或标识符的持续时间和范围。
<强>持续时间:强>
持续时间表示变量的寿命。
<强>范围:强>
范围表示变量的可见度。
<强>静态存储类:强>
在静态存储类用于声明的标识符是一个局部变量或者函数或一个文件,并存在和控制从它被宣布,其中通过后保持其值。该存储类有一个持续时间为永久。声明这个类的一个变量保留其值从函数的一个调用到下一个。范围是局部的。变量仅由它被内声明,或者如果在一个文件中声明全球范围内,它仅由该文件内的功能的公知的或观察到的功能是已知的。此存储类保证变量的该声明还初始化断变量为零或所有位。
<强>的extern存储类:强>
在外部存储方式类用于声明将是已知的功能在一个文件中并能够被已知的所有功能在一个程序中的全局变量。该存储类有一个持续时间为永久。直到被另一个任务改变了这一类的任何变量保留其值。范围是全球性的。变量可以被所有功能的程序内是已知的或可见。