当C++代码需要与C代码进行链接时,由于C++编译器经过了重载和命名改编等操作,因此函数名、变量名等有时需要进行改变,此时如果C++代码直接链接C代码,则可能会发生链接错误。为了解决这个问题,C++提供了extern "C"语法来解决此类问题。
一、extern "C"语法介绍
extern "C"是C++中用于链接C代码的一种机制。当代码被extern "C"包裹时,C++编译器会禁止C++的命名重载和改名功能,从而使得C++代码可以与C代码进行符号链接。例如:
// test.cpp
extern "C" void hello()
{
printf("Hello\n");
}
int main()
{
hello();
return 0;
}
代码中的extern "C"
语法使得hello
函数的名字不会在编译时进行改名,从而使C++编译器可以正确识别这个函数并与C代码进行链接,最终实现代码的正确运行。
二、extern "C"语法的注意点
1. 什么情况下需要使用extern "C"
当C++代码需要与C代码进行链接时,由于C++编译器对函数进行了改名,因此需要使用extern "C"机制来消除这种改名。一般情况下,当我们需要调用一个C源文件中的函数时,就需要使用extern "C"语法。
2. extern "C"语法放在哪里
在C++中,extern "C"可以与函数声明或定义一起使用。例如:
// test.cpp
extern "C" {
void hello();
}
int main()
{
hello();
return 0;
}
// hello.c
void hello()
{
printf("Hello World!\n");
}
3.extern "C"语法的作用对象
extern "C"语法不仅可以用于函数定义中,还可以用于变量、结构体和类的声明或定义中。
三、extern "C"语法示例
1.使用extern "C"链接C++和C代码
我们定义一个C++程序,再定义一个C文件,并在C++程序中调用C函数。
//test.cpp
#include <iostream>
extern "C" {
#include <stdio.h>
}
void hello(){
std::cout<<"Hello"<<std::endl;
}
int main(){
hello();
hello_world();
return 0;
}
//hello.c
void hello_world(){
printf("Hello, world!");
}
我们在C++中定义了一个hello
函数,同时也在函数中通过extern "C"来调用了hello_world
函数(这个函数定义在C文件中),最后实现了对C语言代码的调用。
2. 调用C++内部函数
我们定义一个C++程序,然后我们在其中调用C++的函数。这里不需要用到extern "C"
//test.cpp
#include <iostream>
void hello(){
std::cout<<"Hello"<<std::endl;
}
int main(){
hello();
return 0;
}
上述代码在C++中定义了一个hello
函数,而在main函数中调用了它。因为C++内部的函数在编译时不会进行命名重载和改编,因此不需要使用extern "C"语法
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C/C++中extern “C” 的作用分析 - Python技术站