2017-07-06 42 views
3

我需要你給我解釋一下我怎麼知道我的C程序例如在Windows上工作,如果我把它寫在Linux和它的工作原理上的Linux反之亦然(編寫的程序在Windows中)我如何知道是否會寫Linux上的C程序將工作在別處

還做什麼標準我也跟着寫,這將在不同操作系統上運行的程序?如何檢測庫或整個庫中的函數是否可以在不同的操作系統上工作?

比如我有功能freadfwritefopenfclose從庫stdio.h - 我怎麼知道,如果我能與他們正常的其它系統比Linux工作?與使用文件描述符的函數相同:open,creat,close,read,write來自庫:sys/types.h,sys/stat.h,fcntl.h

+2

困難的方法:通過閱讀文檔。更簡單的方法:在Windows上編譯和測試它。經驗法則:'stdio.h'的東西通常或多或少是兼容的。 –

+0

你的大部分標準庫都可以在windows和linux上工作 –

+0

[在Windows上用Linux編寫的Run C程序]的可能的重複(https://stackoverflow.com/questions/3474685/run-c-program-written-in-linux -on-windows) – woz

回答

10

那麼,這是一種簡單的:你的程序將在Windows上運行,只要它僅使用了兩兩件事:

  • C標準庫,如C標準描述。見例如n1570.pdf,這是最接近實際標準的最新草案版本。請注意,很多C標準庫都附帶各種擴展,當然,您不能使用這些。如果有疑問,編譯例如與-std=c11選項(gccclang)應該隱藏所有擴展聲明。

    這裏有一個額外的陷阱:微軟的實現C標準的不完整。這取決於你的編譯器,C標準庫實際上是鏈接,在MinGW情況下,它是很老msvcrt.dll所以你可能想讀的舊標準,而不是針對其功能就可以使用,例如,只有符合C89, here's a description of the standard library in C89使用微軟的C編譯器,您也可以在標準庫(它們鏈接自己的運行時DLL)中獲得不同級別的C99支持,具體取決於版本。

  • 是可用於Windows,例如像第三方庫SDLGTK+

通過使用opencreatclosereadwrite等,您使用的是POSIX指定的擴展名。某些POSIX函數在Windows上可用,有些稍有不同,有些僅缺失。如果你想保持可移植到Windows,你最好不要使用這些。這個規則的例外是,如果你打算用Cygwin編譯你的代碼,這是一個完整的適用於Windows的POSIX兼容層。

按IanAbbott的評論,這也是至關重要的使用整型正確而不是暗含的假設,比如像「一個long有64位」或「int可以容納一個指針」,這是錯誤的一般情況。總是使用<stdint.h>類型固定寬度,uintptr_t用於指針值,用於size_t對象大小,等等。


雖然與您的問題沒有直接關係:對於大多數不平凡的程序,您遲早會需要使用一些特定於平臺的功能。通常,有些圖書館將其抽象出來,例如如果您需要高效處理I/O事件,而不是在Linux上使用epoll,在FreeBSD上使用kqueue,在Windows上使用IO completion ports等,則可以使用libevent。但是如果你沒有找到這樣一個庫,這裏有一個提示:

明確地將平臺特定的代碼分成它自己的模塊(轉換單元)。這樣,整件事物移植到不同的平臺上的工作變得更小。

+1

程序員還需要了解兩種平臺(以及不同Linux用戶空間架構之間)的標準整數類型的差異。例如,'unsigned long'在64位Linux上是64位寬,而在64位Windows上是32位寬。 –

+0

@IanAbbott我假設他們的目標類型的合理使用,比如使用'(u)intN_t'確切的寬度,'size_t'的大小等等。但是,當然,你必須考慮這一點。 –

+1

值得一提的是,POSIX標準的出現是因爲美國國防部希望圍繞開放標準構建和編寫系統。他們厭倦了購買無法移植到其他平臺的軟件,也不喜歡被防禦供應商勒索贖金。對於所有的弱點,POSIX一直都非常善於讓事情變得更簡單。對他們來說,這是一件令人欽佩的事情,現在是時候有云,OTT網絡等新事物的強制性開放標準了。 – bazza

相關問題