在C ++中," C"之间的区别是什么?功能和" C"联动?

时间:2018-01-29 23:16:28

标签: c++

正如标准所述,语言链接是函数类型的一部分,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::qsortstd::bsearch必须有两个重载。

2 个答案:

答案 0 :(得分:2)

在你引用的例子中," C函数"表示"其类型具有C语言链接的函数"。

也许你在精神上没有分离这两个不同的概念:

  1. 功能类型的语言链接。
  2. 标识符的语言链接。
  3.   

    C函数与C ++链接的作用是什么意思?

    我猜您指的是FUNC f2;,其中函数类型具有C链接,标识符f2 具有C ++链接。

答案 1 :(得分:1)

  

我真的对C函数类型和C链接感到困惑。他们之间有什么区别,除了破坏?

在标准C ++中," C函数"和" C ++功能"不同的类型与intlong是不同类型的方式大致相同,即使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函数的方式完全相同,但是名称会像往常一样被修改为包含函数参数信息等,从而允许它被重载。