外部“C”是否包含C++函数的声明或定义?

2024-10-03 00:25:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我在一个cpp文件中看到external "C" {...}包含了几个函数的定义。在

https://isocpp.org/wiki/faq/mixing-c-and-cpp中,我猜在CPP文件中使用^ {CD2>}的目的是使封闭的C++函数可用在C程序中。在

链接中的示例表明,^ {< CD2>}只包含C++函数的声明,而不是它们的定义

Just declare the C++ function extern "C" (in your C++ code) and call it (from your C or C++ code). For example:

    // C++ code:
    extern "C" void f(int);
    void f(int i)
    {
        // ...
    }

我在开头提到的cpp文件看起来像:

    // C++ code:
    extern "C" {

    void f(int i)
    {
        // ...
    }

    void g(int i)
    {
        // ...
    }

    }

将{cd2>}包含C++函数的声明或定义? 如果是,为什么?在


Tags: and文件函数https声明your定义extern
3条回答

它应该把声明放在头文件中,只要翻译单元是用c++编译器编译的,并且声明在那里看不到,就应该把定义括起来。
在c++代码中同时使用这两种方法是绝对正确的。在

如果用c编译器编译函数定义,就没有必要(或者我应该说语法是错误的,请参阅下面的注释)。在

extern "C" {}作用域控制将普通c符号链接用于内部的所有内容。否则将应用c++ name mangling。在


注:

由于extern "C" {}这不是有效的c语法,要使其与c编译器一起工作,您需要在#ifdef中使用它:

MyHeader.h:

 #ifdef __cplusplus
 extern "C" {
 #endif

 // ... c style function name declarations
 void foo(int i);

 #ifdef __cplusplus
 } // extern "C"
 #endif

extern "C" {}作用域的使用实际上有两个方面:


< H3>将C++代码导出到C<EH3>

如果上面的代码是用c编译器编译的,那么它看起来就像一个普通的c函数声明。如果使用c++编译器编译,extern关键字将应用,并且c++名称的损坏将被抑制。在

关于定义,函数可以在其定义中使用任何c++功能:

^{pr2}$

请注意,声明不包括在这里。这可以作为一种技术使用,当您想重写从weak linkage的库中公开的函数时尤其有用。在

如果包含MyHeader.h,则可以省略extern "C" {}范围。在


< H3>从C++ +EH3>导入C代码

如果在c++编译器中看到上述声明,则再次禁止c++名称损坏,并且链接器将使用纯c函数符号名解析对foo()的任何调用引用:

^{3}$

foo()函数实现是从使用c编译器创建的对象文件(或归档文件)中提供的。在

在[dcl.链接]/第五章:

Except for functions with C++ linkage, a function declaration without a linkage specification shall not precede the first linkage specification for that function. A function can be declared without a linkage specification after an explicit linkage specification has been seen; the linkage explicitly specified in the earlier declaration is not affected by such a function declaration.

就函数的语言连接而言,这两个版本都很好。重要的部分是函数的第一个声明必须有extern "C"。在

最好包括两者。在

< >在C++中连接C代码时,确保符号不被损坏。我们使用外部“C”块。在

每当在外部“C”块中放置一些代码时,C++编译器就确保函数名不被破坏,即编译器生成一个二进制文件,它们的名称不变,就像C编译器所做的那样。在

^ a1}作为C++支持函数重载,所以基本上可以有多个同名函数。因此,为了在生成目标代码时区分不同的函数,它通过添加有关参数的信息来更改名称。向函数名添加附加信息的技术称为名称混乱。在

因为C不支持函数重载。所以在C++中连接C代码时,我们使用外部的C块。在

相关问题 更多 >