做網(wǎng)站可以干什么網(wǎng)站開發(fā)建站
目的
extern "C"是經(jīng)常用到的東西,面試題目也經(jīng)常出現(xiàn),然則,實際用時,還是經(jīng)常遺忘,因此,深入的了解一下,以增強記憶。
extern "C"指令非常有用,因為C和C++的近親關(guān)系。
作用
注意:extern "C"指令中的C,表示的一種編譯和連接規(guī)約,而不是一種語言。C表示符合C語言的編譯和連接規(guī)約的任何語言,如Fortran、assembler等。
另外,extern "C"指令僅指定編譯和連接規(guī)約,但不影響語義。例如在函數(shù)聲明中,指定了extern “C”,仍然要遵守C++的類型檢測、參數(shù)轉(zhuǎn)換規(guī)則。
綜上所述,extern "C"的真實目的是實現(xiàn)類C和C++的混合編程。在C++源文件中的語句前面加上extern “C”,表明它按照類C的編譯和連接規(guī)約來編譯和連接,
而不是C++的編譯的連接規(guī)約。這樣在類C的代碼中就可以調(diào)用C++的函數(shù)或變量等。
生成符號的不同
在C和C++中,生成函數(shù)符號的方式有所不同。
在C語言中,函數(shù)的符號是通過函數(shù)名和參數(shù)類型來生成的。如果兩個函數(shù)的名字相同并且參數(shù)類型也相同,那么它們的符號就是一樣的。
在C++中,函數(shù)符號的生成則更加復(fù)雜,主要是因為C++支持函數(shù)重載,也就是說,兩個函數(shù)可以有相同的名字,
只要它們的參數(shù)類型或者參數(shù)數(shù)量不同。為了區(qū)分這些同名函數(shù),
C++編譯器會將函數(shù)的返回類型,函數(shù)名,參數(shù)類型,參數(shù)數(shù)量,參數(shù)順序等因素考慮進去,生成一個獨一無二的符號。
情況
上面理論講的很清楚,下面用例子試試:
先弄一個C++的函數(shù)例子:
cppFunc.h:
#pragma once
#include <stdio.h>
void cppFunc(int num);
cppFunc.cpp:
#include "cppFunc.h"
void cppFunc(int num)
{printf("enter function cFunc num=%d\n", num);printf("exit function cFunc\n");
}
主函數(shù):
#include <iostream>
#include "cppFunc.h"
int main()
{cppFunc(10);std::cout << "Hello World!\n";
}
運行情況:
符號是這樣的:
c++調(diào)用C函數(shù)的例子
cFunc.h:
#pragma once
#include <stdio.h>
void cFunc(int num);
cFunc.c:
#include "cFunc.h"
void cFunc(int num)
{printf("enter function cFunc num=%d\n", num);printf("exit function cFunc\n");
}
主函數(shù):
#include <iostream>
#include "cFunc.h"
//#include "cppFunc.h"
int main()
{cFunc(8);//cppFunc(10);std::cout << "Hello World!\n";
}
運行情況:
上面表明,C++按照C++的函數(shù)名規(guī)則去鏈接函數(shù),符號為:?cFunc@@YAXH@Z 實際在OBJ中找不到。
從上圖可知:c語言的名字就是 cFunc,所以找不到。
怎么找到呢?
主函數(shù)修改如下:
#include <iostream>
extern "C"
{
#include "cFunc.h"
}
//#include "cppFunc.h"
int main()
{cFunc(8);//cppFunc(10);std::cout << "Hello World!\n";
}
運行情況:
這樣就找到了,這樣就按照C的規(guī)則去找相應(yīng)的函數(shù)。
總結(jié)
extern “C”{},解決了C與C++編譯結(jié)果的混用,如下圖所示: