interview
cpp-basics
C++中extern有什么作用?extern"C"有什么作用?

C++基础面试题, C++ 中 extern 有什么作用?extern C 有什么作用?

C++基础面试题, C++ 中 extern 有什么作用?extern C 有什么作用?

QA

Step 1

Q:: C++ 中 extern 有什么作用?

A:: 在 C++ 中,extern 关键字通常用于声明一个变量或函数是在别的文件或作用域中定义的。当你使用 extern 声明一个变量或函数时,你告诉编译器这个变量或函数在其他地方被定义,而你在当前文件中只是声明它,而非定义。这通常用于分割代码和数据到不同的文件中,以实现模块化和代码重用。例如,在头文件中,你可以用 extern 声明一个全局变量,而在对应的源文件中进行定义。

Step 2

Q:: extern C 有什么作用?

A:: extern C 主要用于 C++ 代码与 C 代码之间的互操作。当你使用 extern C 包围一个函数或函数声明时,告诉编译器使用 C 的方式(即 C 的名字修饰规则)来编译和链接这个函数。这对于需要在 C++ 中调用 C 代码,或者需要将 C++ 代码暴露给 C 编译器时非常重要。它避免了 C++ 的名字修饰(name mangling),确保 C++ 编译器生成的符号可以被 C 编译器识别和调用。

Step 3

Q:: 什么是名字修饰(Name Mangling)?

A:: 名字修饰是指 C++ 编译器在生成目标代码时,将函数或变量的名字转换为包含额外信息的符号名。这些信息通常包括函数的参数类型、命名空间等,以支持函数重载和其他 C++ 特性。由于 C 不支持这些特性,它使用的名字修饰规则非常简单。extern C 可以避免 C++ 名字修饰,以便与 C 代码进行互操作。

Step 4

Q:: 如何在 C++ 中避免名字修饰?

A:: 为了避免 C++ 的名字修饰,可以使用 extern C 关键字声明函数。这样,编译器将按照 C 的名字修饰规则处理这些函数。这在需要混合使用 C 和 C++ 代码时非常有用。例如:


extern "C" void foo();

这将确保 foo 函数在编译后的符号表中使用 C 的名字修饰规则,而不是 C++ 的。

用途

这些内容在面试中被问到的原因在于它们对于理解和处理跨语言调用、代码模块化和链接问题至关重要。在实际生产环境中,`extern` 关键字和 `extern C` 在以下情况中非常常见:\n\n`1.` **跨模块开发**:在大型项目中,代码通常会分布在多个文件中,使用 `extern` 可以避免重复定义数据。\n`2. **与 C 代码库集成**:在需要将 C++ 程序与已有的 C 代码库集成,或者从 C++` 代码中调用 C 语言库时,`extern C` 是必不可少的。\n`3. **动态链接库**:在开发和使用动态链接库(DLL 或 .`so)时,`extern` 关键字通常用于暴露库中的符号,使其能够被外部使用。\n

相关问题

🦆
C++ 中 static 关键字的作用是什么?

在 C++ 中,static 关键字可以用于变量和函数。对于变量,static 表示该变量的生存期贯穿整个程序,而不是局部变量那样的自动生存期。对于类的静态成员变量,static 表示该变量属于类本身而不是某个特定对象。对于函数,static 表示该函数的作用域仅限于定义它的文件(内部链接)。

🦆
什么是静态链接和动态链接?

静态链接是在编译时将所有需要的库代码嵌入生成的可执行文件中,从而形成一个独立的、可以直接运行的程序。动态链接则是在运行时将库加载到内存中,程序使用这些库中的代码。动态链接的好处是可以节省内存空间和允许库的版本更新,而不需要重新编译整个程序。

🦆
C++ 中如何实现动态链接库的导出和导入?

在 C++ 中,使用宏和 extern 关键字实现动态链接库的导出和导入。通常使用 __declspec(dllexport)__declspec(dllimport) 修饰符(在 Windows 平台上),来标记导出和导入的符号。例如,库内部定义函数时使用 __declspec(dllexport),而在使用库时使用 __declspec(dllimport)。在跨平台环境下,可以通过定义跨平台宏来实现类似的功能。