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++
的。