C 對於C語言可移植性的思考

2021-07-13 02:56:07 字數 1237 閱讀 4565

我相信學過c語言的同學,都會在書中看到c語言特點一定有:可移植性。但是什麼是可移植?如何才能可移植?c語言是如何做到可移植的?對於初學者,可移植可能是乙個經常遇到卻很神秘的詞。我想通過這篇文章來表達我對於可移植性的一些想法。

下面我就來說說可移植,可移植顧名思義就是可以從乙個平台移植到另外乙個平台,但是大家一定要清楚,移植是基於作業系統的。但是這個時候,我們需要注意一點:基於各種作業系統平台不同,應用程式在二級制級別是不能直接移植的。我們只能在**層去思考可移植問題,在api層面上由於各個作業系統的命名規範、系統呼叫等自身原因,在api層面上實現可移植也是不大可能的。那怎麼才能實現可移植呢?

我們首先來看看現在主流的windows和linux平台下**可移植性。有什麼辦法解決這個問題呢?答案是:在各個平台之間,基於大部分需求抽象出乙個中間層。在中間層中,中間層用了遮蔽底層細節,在我們程式設計師看來c言語庫就是這樣乙個中間層的作用。在各個平台下,我們預設c標準庫中的函式都是一樣的,這樣基本可以實現可移植。但是對於c庫本身而言,在各種作業系統平台下其內部實現是完全不同的,也就是說c庫封裝了作業系統api在其內部的實現細節。

因此,c語言提供了我們在**級的可移植性,即這種可移植是通過c語言這個中間層來完成的。

當然,大家都可以看出上面的可移植是有條件的,c語言本身不能實現完全的可移植,為什麼呢?因為,在我們程式中,我們經常會呼叫系統api,由於這些api在c語言中沒有對其封裝,所以我們只能用使用其原始的api,對於原始的api在各個作業系統中他們命名不同,就不能跨平台移植。所以,我們要寫出完完全全的跨平台的程式,還是需要其他的一些手段。例如在我們的**中下功夫。以下**可以幫助我們實現各平台之間的可移植:

#ifdef _windows_

createthread();      //windows下執行緒的建立

#else

pthread_create();    //linux下執行緒的建立

#endif

對於標頭檔案,也使用同樣的預編譯巨集來實現。如:

#ifndef _windows_

#include

#else

#include

#endif

這樣就可以實現**的可移植了。在編譯的時候只要通過#define就可以選擇在那個平台下完成程式的編譯。

綜上所述,我們都是將c,c++等各種語言當作中間層,以實現其一定程度上的可移植。如今,語言的跨平台的程式都是以這樣的方式實現的。但是在不同的平台下,仍需要重新編譯。  

本文出自 「helloworld」 部落格,請務必保留此出處

C 編譯 解釋型語言 可移植性

編譯型語言 程式在執行之前,需要先 編譯 得到乙個 exe二進位制檔案 在執行時,就不需要進行編譯,直接使用這個exe即可 解釋型語言 程式在執行之前,不需要編譯,他的程式 就是 原本的文字檔案 即你的程式文字 就是最終執行檔案 需要翻譯和執行,同時執行 自然,編譯性語言 要比 解釋型語言,要快 你...

程式語言的可移植性

假如,你為執行windows 2000 的老式奔騰pc編寫了乙個很好用的c 程式,而管理人員決定使用不同作業系統 如mac os x 或者 linux 和處理器 如sparc處理器 的計算機替換它。該程式 是否可以在新平台上執行呢?當然,必須使用為新平台設計的c 編譯器對程式重新編譯後再執行。如果在...

CppUnit的可移植性

因為假期要打工要使用bcb來做東西,所以在bcb6 sp4下試一下cppunit,結果發現1.8.0對vc的支援比較好,但是在bcb下不能直接編譯。而1.10.2就可以直接在bcb下編譯通過,我將所有cppunit目錄下的檔案都加入乙個lib工程,直接編譯成lib然後平時使用時,在工程中加入標頭檔案...