在 C++ 中,extern
是一个关键字,用于声明变量或函数的外部链接性。
它的主要作用是告诉编译器某个变量或函数是在其他地方定义的,而不是在当前文件中定义的。
extern "C"
则是用于解决 C++ 与 C 混合编程时的名称修饰(Name Mangling)问题。
1. extern 的作用
extern
用于声明一个变量或函数是在其他文件中定义的,而不是在当前文件中定义的。它的作用是告诉编译器在链接时从其他文件中找到该变量或函数的定义。
用于变量
// file1.cpp
int globalVar = 10; // 定义全局变量
// file2.cpp
extern int globalVar; // 声明全局变量,告诉编译器 globalVar 在其他文件中定义
int main() {
std::cout << globalVar << std::endl; // 输出 10
return 0;
}
用于函数
// file1.cpp
void printMessage() {
std::cout << "Hello, World!" << std::endl;
}
// file2.cpp
extern void printMessage(); // 声明函数,告诉编译器 printMessage 在其他文件中定义
int main() {
printMessage(); // 调用函数
return 0;
}
作用:
- 声明外部变量或函数,避免重复定义。
- 允许多个文件共享同一个全局变量或函数。
2. extern “C” 的作用
extern "C"
用于解决 C++ 与 C 混合编程时的名称修饰(Name Mangling)问题。C++ 编译器会对函数名进行修饰(例如添加参数类型信息),而 C 编译器不会。使用 extern "C"
可以告诉 C++ 编译器按照 C 的方式处理函数名,从而使得 C++ 代码可以调用 C 函数,或者 C 代码可以调用 C++ 函数。
C++ 调用 C 函数
// mylib.c (C 文件)
#include <stdio.h>
void printMessage() {
printf("Hello from C!\n");
}
// main.cpp (C++ 文件)
extern "C" {
void printMessage(); // 告诉 C++ 编译器按照 C 的方式处理函数名
}
int main() {
printMessage(); // 调用 C 函数
return 0;
}
C 调用 C++ 函数
// mylib.cpp (C++ 文件)
extern "C" void printMessage() { // 告诉 C++ 编译器按照 C 的方式处理函数名
std::cout << "Hello from C++!" << std::endl;
}
// main.c (C 文件)
void printMessage(); // 声明 C++ 函数
int main() {
printMessage(); // 调用 C++ 函数
return 0;
}
作用:
- 解决 C++ 与 C 混合编程时的名称修饰问题。
- 使得 C++ 代码可以调用 C 函数,或者 C 代码可以调用 C++ 函数。
3. 总结
关键字 | 作用 |
---|---|
extern | 声明变量或函数是在其他文件中定义的,避免重复定义,允许多文件共享。 |
extern “C” | 解决 C++ 与 C 混合编程时的名称修饰问题,使得 C++ 和 C 代码可以互相调用。 |
extern
用于声明外部变量或函数,避免重复定义。extern "C"
用于解决 C++ 与 C 混合编程时的名称修饰问题,确保函数名按照 C 的方式处理。
THE END
暂无评论内容