C語言是面向過程的,而C++是面向?qū)ο蟮?/p>

C和C++的區(qū)別:

C是一個結(jié)構(gòu)化語言,它的重點在于算法和數(shù)據(jù)結(jié)構(gòu)。C程序的設(shè)計首要考慮的是如何通過一個過程,對輸入(或環(huán)境條件)進行運算處理得到輸出(或?qū)崿F(xiàn)過程(事務(wù))控制)。

C++,首要考慮的是如何構(gòu)造一個對象模型,讓這個模型能夠契合與之對應(yīng)的問題域,這樣就可以通過獲取對象的狀態(tài)信息得到輸出或?qū)崿F(xiàn)過程(事務(wù))控制。 所以C與C++的最大區(qū)別在于它們的用于解決問題的思想方法不一樣。之所以說C++比C更先進,是因為“ 設(shè)計這個概念已經(jīng)被融入到C++之中 ”。

C與C++的最大區(qū)別:在于它們的用于解決問題的思想方法不一樣。之所以說C++比C更先進,是因為“ 設(shè)計這個概念已經(jīng)被融入到C++之中 ”,而就語言本身而言,在C中更多的是算法的概念。那么是不是C就不重要了,錯!算法是程序設(shè)計的基礎(chǔ),好的設(shè)計如果沒有好的算法,一樣不行。而且,“C加上好的設(shè)計”也能寫出非常好的東西。

1.弁言  C++說話的建樹初志是“a better C”,可是這并不料味著C++中近似C說話的全局變量和函數(shù)所接納的編譯和毗連編制與C說話完全不異。作為一種欲與C兼容的說話,C++保留了一局部過程 式說話的特點(被世人稱為“不徹底地面向工具”),因而它可以界說不屬于任何類的全局變量和函數(shù)??墒?,C++現(xiàn)實了局是一種面向工具的軌范設(shè)計說話,為了支 持函數(shù)的重載,C++對全局函數(shù)的措置編制與C有較著的不合。

2.從標準頭文件說起

某企業(yè)已經(jīng)給出如下的一道面試題:為什么標準頭文件都有近似以下的構(gòu)造?

#ifndef __INCvxWorksh

#define __INCvxWorksh

#ifdef __cplusplus

extern "C" {

#endif

/*...*/

#ifdef __cplusplus

}

#endif

#endif /* __INCvxWorksh */

顯然,頭文件中的編譯宏“#ifndef __INCvxWorksh、#define __INCvxWorksh、#endif” 的浸染是防止該頭文件被頻頻引用。那么

#ifdef __cplusplus

extern "C" {

#endif

#ifdef __cplusplus

}

#endif

的浸染又是什么呢?我們將不才文逐一道來。

3.深層揭密extern "C"  extern "C" 包含雙重寄義,從字面上即可獲得:首先,被它潤飾的方針是“extern”的;其次,被它潤飾的方針是“C”的。讓我們來詳細解讀這兩重寄義。

被extern "C"限定的函數(shù)或變量是extern類型的;

extern是C/C++說話中剖明函數(shù)和全局變量浸染規(guī)模(可見性)的關(guān)頭字,該關(guān)頭字告訴編譯器,其聲明的函數(shù)和變量可以在本模塊或其它模塊中使用。記住,下列語句:

extern int a;

僅僅是一個變量的聲明,其并不是在界說變量a,并未為a分配內(nèi)存空間。變量a在所有模塊中作為一種全局變量只能被界說一次,不然會出現(xiàn)毗連錯誤。

通常,在模塊的頭文件中對本模塊供給給其它模塊引用的函數(shù)和全局變量以關(guān)頭字extern聲明。例如,若是模塊B欲引用該模塊A中界說的全局變量和函數(shù) 時只需包含模塊A的頭文件即可。如許,模塊B中挪用模塊A中的函數(shù)時,在編譯階段,模塊B雖然找不到該函數(shù),可是并不會報錯;它會在毗連階段中從模塊A編 譯生成的方針代碼中找到此函數(shù)。

與extern對應(yīng)的關(guān)頭字是static,被它潤飾的全局變量和函數(shù)只能在本模塊中使用。是以,一個函數(shù)或變量只可能被本模塊使用時,其不成能被extern “C”潤飾。

被extern "C"潤飾的變量和函數(shù)是按照C說話編制編譯和毗連的;

未加extern “C”聲明時的編譯編制

首先看看C++中對近似C的函數(shù)是若何編譯的。

作為一種面向工具的說話,C++支撐函數(shù)重載,而過程式說話C則不支撐。函數(shù)被C++編譯后在符號庫中的名字與C說話的不合。例如,假設(shè)某個函數(shù)的原型為:

void foo( int x, int y );

該函數(shù)被C編譯器編譯后在符號庫中的名字為_foo,而C++編譯器則會產(chǎn)生像_foo_int_int之類的名字(不合的編譯器可能生成的名字不合,可是都接納了不異的機制,生成的新名字稱為“mangled name”)。

_foo_int_int如許的名字包含了函數(shù)名、函數(shù)參數(shù)數(shù)目及類型信息,C++就是靠這種機制來實現(xiàn)函數(shù)重載的。例如,在C++中,函數(shù)void foo( int x, int y )與void foo( int x, float y )編譯生成的符號是不不異的,后者為_foo_int_float。

同樣地,C++中的變量 除支撐局部變量外,還支撐類成員變量和全局變量。用戶所編寫軌范的類成員變量可能與全局變量同名,我們以"."來區(qū)分。而本質(zhì)上,編譯器在停止編譯時,與 函數(shù)的措置類似,也為類中的變量取了一個并世無雙的名字,這個名字與用戶軌范中同名的全局變量名字不合。

未加extern "C"聲明時的毗連編制

假設(shè)在C++中,模塊A的頭文件如下:

// 模塊A頭文件 moduleA.h

#ifndef MODULE_A_H

#define MODULE_A_H

int foo( int x, int y );

#endif

在模塊B中引用該函數(shù):

// 模塊B實現(xiàn)文件 moduleB.cpp

#include "moduleA.h"

foo(2,3);

實際上,在毗連階段,毗連器會從模塊A生成的方針文件moduleA.obj中探求_foo_int_int如許的符號!

加extern "C"聲明后的編譯和毗連編制

加extern "C"聲明后,模塊A的頭文件變?yōu)椋?/p>

// 模塊A頭文件 moduleA.h

#ifndef MODULE_A_H

#define MODULE_A_H

extern "C" int foo( int x, int y );

#endif

在模塊B的實現(xiàn)文件中仍然挪用foo( 2,3 ),其成效是:

(1)模塊A編譯生成foo的方針代碼時,沒有對其名字停止不凡措置,接納了C說話的編制;

(2)毗連器在為模塊B的方針代碼探求foo(2,3)挪用時,探求的是未經(jīng)改削的符號名_foo。

若是在模塊A中函數(shù)聲了然foo為extern "C"類型,而模塊B中包含的是extern int foo( int x, int y ) ,則模塊B找不到模塊A中的函數(shù);反之亦然。

所以,可以用一句話歸納綜合extern “C”這個聲明的真實目的(任何說話中的任何語法特征的降生都不是隨意而為的,來歷于真實世界的需求驅(qū)動。我們在思慮問題時,不能只勾留在這個說話是怎樣 做的,還要問一問它為什么要這么做,念頭是什么,如許我們可以更深切地輿解良多問題):

實現(xiàn)C++與C及其它說話的同化編程。

明白了C++中extern "C"的設(shè)立念頭,我們下面來詳細分析extern "C"通常的使用技巧。

4.extern "C"的慣用法  (1)在C++中引用C說話中的函數(shù)和變量,在包含C說話頭文件(假設(shè)為cExam)時,需停止下列措置:

extern "C"

{

#include "cExam"

}

而在C說話的頭文件中,對其外部函數(shù)只能指定為extern類型,C說話中不支撐extern "C"聲明,在.c文件中包含了extern "C"時會出現(xiàn)編譯語法錯誤。

筆者編寫的C++引用C函數(shù)例子工程中包含的三個文件的源代碼如下:

/* c說話頭文件:cExam */

#ifndef C_EXAMPLE_H

#define C_EXAMPLE_H

extern int add(int x,int y);

#endif

/* c說話實現(xiàn)文件:cExam */

#include "cExam"

int add( int x, int y )

{

return x + y;

}

// c++實現(xiàn)文件,挪用add:c

extern "C"

{

#include "cExam"

}

int main(int argc, char* argv[])

{

add(2,3);

return 0;

}

若是C++挪用一個C說話編寫的.DLL時,當網(wǎng)羅.DLL的頭文件或聲明接口函數(shù)時,應(yīng)加extern "C" { }。

(2)在C中引用C++說話中的函數(shù)和變量時,C++的頭文件需添加extern "C",可是在C說話中不能直接引用聲了然extern "C"的該頭文件,應(yīng)該僅將C文件中將C++中界說的extern "C"函數(shù)聲明為extern類型。

筆者編寫的C引用C++函數(shù)例子工程中包含的三個文件的源代碼如下:

//C++頭文件 cppExam

#ifndef CPP_EXAMPLE_H

#define CPP_EXAMPLE_H

extern "C" int add( int x, int y );

#endif

//C++實現(xiàn)文件 cppExampp

#include "cppExam"

int add( int x, int y )

{

return x + y;

}

/* C實現(xiàn)文件 cFile.c

/* 如許會編譯出錯:#include "cExam" */

extern int add( int x, int y );

int main( int argc, char* argv[] )

{

add( 2, 3 );

return 0;

}

若是深切理解了第3節(jié)中所闡述的extern "C"在編譯和毗連階段闡揚的浸染,就能真正理解本節(jié)所闡述的從C++引用C函數(shù)和C引用C++函數(shù)的慣用法。對第4節(jié)給出的示例代碼,必要特別寄望各個細節(jié)。

這些是C/C++能做的

服務(wù)器開發(fā)工程師、人工智能、云計算工程師、信息安全(黑客反黑客)、大數(shù)據(jù) 、數(shù)據(jù)平臺、嵌入式工程師、流媒體服務(wù)器、數(shù)據(jù)控解、圖像處理、音頻視頻開發(fā)工程師、游戲服務(wù)器、分布式系統(tǒng)、游戲輔助等

1.《c和c如何互相調(diào)用》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識,僅代表作者本人觀點,與本網(wǎng)站無關(guān),侵刪請聯(lián)系頁腳下方聯(lián)系方式。

2.《c和c如何互相調(diào)用》僅供讀者參考,本網(wǎng)站未對該內(nèi)容進行證實,對其原創(chuàng)性、真實性、完整性、及時性不作任何保證。

3.文章轉(zhuǎn)載時請保留本站內(nèi)容來源地址,http://f99ss.com/keji/3239544.html