正如标准所述,语言链接是函数类型的一部分,cppreference给出了以下示例
extern "C" void f1(void(*pf)()); // declares a function f1 with C linkage,
// which returns void and takes a pointer to a C function
// which returns void and takes no parameters
extern "C" typedef void FUNC(); // declares FUNC as a C function type that returns void
// and takes no parameters
FUNC f2; // the name f2 has C++ linkage, but its type is C function
extern "C" FUNC f3; // the name f3 has C linkage and its type is C function void()
void (*pf2)(FUNC*); // the name pf2 has C++ linkage, and its type is
// "pointer to a C++ function which returns void and takes one
// argument of type 'pointer to the C function which returns void
// and takes no parameters'"
extern "C" {
static void f4(); // the name of the function f4 has internal linkage (no language)
// but the function's type has C language linkage
}
我真的对C函数类型和C链接感到困惑。他们之间有什么区别,除了破坏?具有C ++链接的C函数意味着什么?谢谢!
更新:这并不是在问extern "C"
是什么,因为这并不能解答为什么C函数可以有C ++链接,而且,什么是C函数(在C ++中) ,以及为什么std::qsort
,std::bsearch
必须有两个重载。
答案 0 :(得分:2)
在你引用的例子中," C函数"表示"其类型具有C语言链接的函数"。
也许你在精神上没有分离这两个不同的概念:
C函数与C ++链接的作用是什么意思?
我猜您指的是FUNC f2;
,其中函数类型具有C链接,标识符f2
具有C ++链接。
答案 1 :(得分:1)
我真的对C函数类型和C链接感到困惑。他们之间有什么区别,除了破坏?
在标准C ++中," C函数"和" C ++功能"不同的类型与int
和long
是不同类型的方式大致相同,即使INT_MAX == LONG_MAX
也是如此。在许多实现中,类型行为完全相同并不重要。重要的是,在某些实现中,类型可能表现不同,并且所有实现都应该因此而将类型视为不同。这意味着在标准C ++中,
extern "C" void f();
void (*fp)() = &f; // ERROR
无效,因为初始化程序与正在初始化的类型不兼容。 "指向C函数的指针"之间没有隐式转换。和"指向C ++函数"。
无法将C和C ++函数视为相同类型的实现的最现实的假设场景是对C与C ++函数使用不同调用约定的实现。
C函数与C ++链接的作用是什么意思?
我猜这是关于
FUNC f2; // the name f2 has C++ linkage, but its type is C function
这意味着调用函数的方式与调用C函数的方式完全相同,但是名称会像往常一样被修改为包含函数参数信息等,从而允许它被重载。