我相信學過C語言的同學,都會在書中看到C語言特點一定有:可移植性。但是什麼是可移植?如何才能可移植?C語言是如何做到可移植的?對於初學者,可移植可能是一個經常遇到卻很神秘的詞。我想通過這篇文章來表達我對於可移植性的一些想法。
首先,在這裡鋪墊一下。學過Win32程序設計的人肯定都聽說過APIApplication Program Interface)。我就先說說API,高手繞過。API對於程序員來說就是系統提供的接口,任何涉及系統調用都要通過API來完成。對於不同的操作系統都有不同的一套API,也就是說對於不同的操作系統系統調用的接口是完全不同的。所以在API層我們是不能移植的。
下面我就來說說可移植,可移植顧名思義就是可以從一個平台移植到另外一個平台,但是大家一定要清楚,移植是基於操作系統的。但是這個時候,我們需要注意一點:基於各種操作系統平台不同,應用程序在二級制級別是不能直接移植的。我們只能在代碼層去思考可移植問題,在API層面上由於各個操作系統的命名規范、系統調用等自身原因,在API層面上實現可移植也是不大可能的。那怎麼才能實現可移植呢? 我們首先來看看現在主流的Windows和Linux平台下代碼可移植性。有什麼辦法解決這個問題呢?答案是:在各個平台之間,基於大部分需求抽象出一個中間層。在中間層中,中間層用了屏蔽底層細節,在我們程序員看來C言語庫就是這樣一個中間層的作用。在各個平台下,我們默認C標准庫中的函數都是一樣的,這樣基本可以實現可移植。但是對於C庫本身而言,在各種操作系統平台下其內部實現是完全不同的,也就是說C庫封裝了操作系統API在其內部的實現細節。 因此,C語言提供了我們在代碼級的可移植性,即這種可移植是通過C語言這個中間層來完成的。 當然,大家都可以看出上面的可移植是有條件的,C語言本身不能實現完全的可移植,為什麼呢?因為,在我們程序中,我們經常會調用系統API,由於這些API在C語言中沒有對其封裝,所以我們只能用使用其原始的API,對於原始的API在各個操作系統中他們命名不同,就不能跨平台移植。所以,我們要寫出完完全全的跨平台的程序,還是需要其他的一些手段。例如在我們的代碼中下功夫。以下代碼可以幫助我們實現各平台之間的可移植: #ifndef _WINDOWS_ CreateThread(); //windows下線程的創建 #else Pthread_create(); //Linux下線程的創建 #endif 對於頭文件,也使用同樣的預編譯宏來實現。如: #ifndef _WINDOWS_ #include <windows.h> #else #include <thread.h> #endif 這樣就可以實現代碼的可移植了。在編譯的時候只要通過#define就可以選擇在那個平台下完成程序的編譯。 綜上所述,我們都是將C,C++等各種語言當作中間層,以實現其一定程度上的可移植。如今,語言的跨平台的程序都是以這樣的方式實現的。但是在不同的平台下,仍需要重新編譯。本文出自 “HelloWorld” 博客,請務必保留此出處http://vanshell.blog.51cto.com/890307/417068