extern “C“的定义以及它在C++代码中有什么作用

extern "C"  C++ 语言中的一个特殊声明,它告诉 C++ 编译器在编译过程中按照 C 语言的方式来处理被 extern "C" 声明的代码。这主要用于解决 C++ C 语言之间的兼容性问题,特别是在混合编程时。

作用

  1. 避免名称修饰(Name Mangling
    C++ 支持函数重载,这意味着可以有多个同名函数,只要它们的参数列表不同。为了支持这一特性,C++ 编译器会对函数名进行修饰(也称为名称改编或名称重整),以便在链接时区分不同的函数。然而,C 语言不支持函数重载,也不对函数名进行修饰。因此,当 C++ 代码需要调用 C 写的库函数时,就必须使用 extern "C" 来避免 C++ 编译器对函数名进行修饰,以确保链接器能够找到正确的函数。
  2. 提高兼容性
    extern "C" 使得 C++ 代码能够无缝地调用 C 写的库函数,同时也允许 C 代码调用 C++ 写的函数(尽管后者通常需要更复杂的处理,如使用 extern "C" 包裹的 C++ 函数作为接口)。

使用方式

extern "C" 可以用于两种情况:

  • 包裹整个头文件
    当整个 C 头文件都需要按照 C 的方式处理时,可以在包含该头文件之前使用 extern "C" 包裹起来。这通常用于包含 C 标准库或其他 C 写的库的头文件。

cpp复制代码

extern "C" {

#include <some_c_library.h>

}

  • 单独声明函数或变量
    也可以仅对特定的 C 函数或变量使用 extern "C" 进行声明。

cpp复制代码

extern "C" void someCFunction();

extern "C" int someCVariable;

注意事项

  • extern "C" 只影响链接阶段,对代码的运行时行为没有影响。
  • extern "C" 不适用于模板或类成员函数,因为 C 语言不支持这些特性。
  • 在 C++ 代码中调用 C 写的库函数时,除了可能需要 extern "C" 外,还需要确保库本身已经被正确编译和链接。
  • 在 C++ 代码中定义全局变量时,如果希望这些变量在 C 代码中也可见,也需要使用 extern "C" 进行声明。但是,由于全局变量的作用域和生命周期问题,这种做法需要谨慎使用。

C++(以及C语言)中,并没有直接名为“extern constant class”的语法结构或概念。不过,我们可以分别解释externconstclass这三个关键字,并探讨它们可能如何一起使用。

1. extern

extern关键字在C++中主要用于两个目的:

  • 声明外部链接的变量或函数:它告诉编译器该变量或函数是在其他地方定义的,因此编译器在编译当前文件时不会为其分配存储空间,而是在链接阶段从其他编译单元(通常是其他.cpp文件)中寻找实际的定义。这主要用于全局变量或函数在不同源文件之间的共享。
  • "C"一起使用以支持C++代码调用C代码:extern "C"用于告诉C++编译器,接下来的代码(函数或变量声明)应该按照C语言的规则来编译和链接,这主要用于解决C++和C之间因名称修饰(Name Mangling)导致的链接问题。

2. const

const关键字用于声明一个常量,即一个其值在初始化后不能被修改的变量。const修饰的变量在定义时必须被初始化,并且在程序的剩余部分中保持其值不变。const既可以用于基本数据类型,也可以用于复杂的数据类型(如类类型)的成员变量。

3. class

classC++中用于定义类的关键字。类是一种用户定义的类型,它封装了数据(成员变量)和操作这些数据的方法(成员函数)。类是面向对象编程(OOP)的基础。

4. extern constant class的误解

由于“extern constant class”不是一个标准的C++语法结构,这里可能存在一些误解。然而,我们可以考虑以下几种可能的组合和用途:

  • extern const 一起使用:通常用于声明一个在其他地方定义的常量,该常量在整个程序中可见。但是,这通常不直接用于类,而是用于类之外的常量变量。
  • const 修饰类成员:在类定义中,const可以用来修饰成员变量或成员函数,表示这些成员在初始化或定义后不会被修改(对于成员变量)或不会修改任何成员变量(对于成员函数)。
  • extern 修饰类成员函数:虽然不常见,但理论上可以使用extern来声明一个在其他编译单元中定义的类成员函数。然而,这通常不是必需的,因为类的成员函数通常是通过类的作用域来访问的,而不是通过extern。

5. 结论

因此,“extern constant class”不是一个有效的C++语法结构。如果你想要在C++中使用externconstclass,你需要根据具体的场景和需求来正确地组合这些关键字。例如,你可以有一个extern声明的常量变量,或者一个包含const成员变量的类,但你不会看到“extern constant class”这样的直接组合。

上一篇:语法


下一篇:谷歌C语言编码规范详解