關於extern ”C“以及vs2008裏的實例

1.首先介紹一下vs2008對C和C++文件的分別編譯

(1)在一個工程下分別編譯C和C++文件並鏈接:

分別編譯很簡單:

選擇要設置的文件:屬性-->C/C++-->高級-->編譯爲,然後下拉菜單中選擇:編譯爲C代碼(/TC) [或者選擇編譯爲C++代碼(/TP)]。這樣就可以對不同語言文件分別編譯。

下一個工作是設置鏈接器的內容。不同編譯器生成的目標文件中,符號表裏面的符號命名準則可能會有不同,所以鏈接時會遇到“無法解析的外部符號”的錯誤。解決這個問題,使用 extern “C”,進行鏈接指示

(2)如果出現如下編譯錯誤:

1>cl: 命令行 error D8045 :不能使用 /clr 選項編譯 C 文件“.\C_Header.c”
那試試去掉/clr選項:
工程配置->常規->公共語言支持(在下拉菜單中改爲無公共語言支持);

——————————————————————————————————————————————————————————————————2.下面介紹extern和C

i.     extern是C/C++語言中表明函數全局變量作用範圍(可見性)的關鍵字,該關鍵字告訴編譯器,其聲明的函數和變量可以在本模塊或其它模塊中使用。通常,在模塊的頭文件中對本模塊提供給其它模塊引用的函數和全局變量以關鍵字extern聲明。例如,如果模塊B欲引用該模塊A中定義的全局變量和函數時只需包含模塊A的頭文件即可。這樣,模塊B中調用模塊A中的函數時,在編譯階段,模塊B雖然找不到該函數,但是並不會報錯;它會在連接階段中從模塊A編譯生成的目標代碼中找到此函數。

與extern對應的關鍵字是 static,被它修飾的全局變量和函數只能在本模塊中使用。因此,一個函數或變量只可能被本模塊使用時,其不可能被extern “C”修飾。

ii.extern "C"

1
extern "C" char*strcpy(char*,const char*);

注意它與下面的聲明的不同之處:

1
extern char*strcpy(char*,const char*);

下面的這個聲明僅表示在連接的時候調用strcpy()。

extern "C"指令非常有用,因爲C和C++的近親關係。注意:extern "C"指令中的C,表示的一種編譯和連接規約,而不是一種語言。C表示符合C語言的編譯和連接規約的任何語言,如Fortran、assembler等。

還有要說明的是,extern "C"指令僅指定編譯和連接規約,但不影響語義。例如在函數聲明中,指定了extern "C",仍然要遵守C++的類型檢測、參數轉換規則。

再看下面的一個例子,爲了聲明一個變量而不是定義一個變量,你必須在聲明時指定extern關鍵字,但是當你又加上了"C",它不會改變語義,但是會改變它的編譯和連接方式。

如果你有很多語言要加上extern "C",你可以將它們放到extern "C"{ }中。

iii.(結論)通過上面兩節的分析,我們知道extern "C"的真實目的是實現類C和C++的混合編程。在C++源文件中的語句前面加上extern "C",表明它按照類C的編譯和連接規約來編譯和連接,而不是C++的編譯的連接規約。這樣在類C的代碼中就可以調用C++的函數or變量等。(注:我在這裏所說的類C,代表的是跟C語言的編譯和連接方式一致的所有語言)

3.C++中調用C中的函數

//頭文件C_Header.h
#ifndef _C_HEADER_H
#define _C_HEADER_H
extern void print(int i); //extern可有可無
#endif
//C的源文件C_Header.c
#include <stdio.h>
#include"C_Header.h"
void print(int i)
{
	printf("i = %d\n",i);
}

//C++源程序:Main.cpp
#ifdef  __cplusplus
extern "C"
{
#endif
	#include "C_Header.h"
#ifdef  __cplusplus
}
#endif
#include<iostream>
int main(int argc,char** argv)
{
print(3);
int i = 0;
std::cin>>i;
return 0;
}
4.C中調用C++
//c++頭文件C++.h
#ifndef _CPLUSPLUS_H
#define _CPLUSPLUS_H
extern "C" void show(int i);//注意這裏用的extern "C"
#endif

//C++源文件:C++.cpp
#include "C++.h"
#include<iostream>
void show(int i)
{
	std::cout<<"i = "<<i<<std::endl;
}

//C源文件:C.c
extern void show(int i);//這裏不可用#include"C++.h",因爲C語言中不可用extern "C"
#include <stdio.h>
int main()
{
	int i = 8;
	show(i);
	scanf("%d",&i);
	return 0;
}

                                                                                      請留下你的足跡, 相互學習。謝謝





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章