1. 程式人生 > >C/C++混合程式設計--extern “C” 使用方法詳解

C/C++混合程式設計--extern “C” 使用方法詳解

1. 首先要明白:
被extern “C”修飾的變數和函式是按照C語言方式編譯和連結的
(1) 首先看看C++中對類似C的函式是怎樣編譯的。
C++支援函式過載,而過程式語言C則不支援。函式被C++編譯後在符號庫中的名字與C語言的不同。例如,假設某個函式的原型為:
void foo( int x, int y );
該函式被C編譯器編譯後在符號庫中的名字為_foo,而C++編譯器則會產生像_foo_int_int之類的名字。_foo_int_int這樣的名字包含了函式名、函式引數數量及型別資訊,C++就是靠這種機制來實現函式過載的。

2. 在C++和C混合程式設計時:
在C++和C語言混合程式設計時,C++的語法是完全包含C語言的語法的,所以不用擔心語法上出現什麼問題。出現問題的主要原因在編譯

連結時。
錯誤的案例:

//head.h 標頭檔案
void print(int a, int b);

-----------------------------------

//head.c  C語言的實現檔案
#include <stdio.h>
#include "head.h"
void print(int a, int b)
{
	printf("這裡呼叫的是C語言的函式:%d,%d\n", a, b);
}

-----------------------------------

//main.cpp 呼叫head.h中的print函式
#include "head.h"
#include <stdio.h> #include <stdlib.h> int main(int argc, char **argv) { print(1, 2); return(0); }

錯誤資訊:1>main.obj : error LNK2019: 無法解析的外部符號 “void __cdecl print(int,int)” ([email protected]@[email protected]),該符號在函式 _main 中被引用

正確的案例:C++/C混合程式設計的萬能公式
解決方案:僅僅需要在head.h標頭檔案中,新增#ifdef __cplusplus extern “C”

//head.h 標頭檔案
#ifdef  __cplusplus   //如果當前使用的是C++編譯器
extern "C" {          //用C的方式編譯宣告的函式
#endif  

	extern void print(int a, int b);

#ifdef  __cplusplus  
}
#endif  /* end of __cplusplus */  

-----------------------------------

//head.c  C語言的實現檔案
#include <stdio.h>
#include "head.h"
void print(int a, int b)
{
	printf("這裡呼叫的是C語言的函式:%d,%d\n", a, b);
}

-----------------------------------

//main.cpp 呼叫head.h中的print函式
#include "head.h"  
#include <stdio.h>  
#include <stdlib.h>  
int main(int argc, char **argv)
{
	
	print(1, 2);
	return(0);
}