c 跨平台技術學習 三 使用標準API

2021-07-23 15:39:14 字數 3652 閱讀 1584

posix.1 api定義了大量的函式,在各方面的功能都很豐富,下面對其進行介紹

它是乙份描述了at&t unix system v作業系統的文件,與posix.1保持一致,是它的乙個超集。svid由基礎系統和擴充套件定義,它只定義了c程式設計介面,沒有定義任何使用者級別的命令,基礎系統更進一步細分幾個類別

這個類別包含了將近40個函式支援各種數學操作,如abs、floor、ceil、sin、cos、tan、log、log10、pow和sqrt。

有超過150個函式,包括str族(strok、strncat等);ctype函式如toascii、tolower、isupper和isdigit,轉換函式如asctime、atof、atol和atoi;多位元組和寬字元函式如mblen、mbrtow、wscncpy、wcsstr和wcsncpy;以及men族函式,包括memchr、memcpy、memset和memmove

大部分開發人員都知道berkeley sockets api在網路應用中的角色,但是socket、bind、listen、accept、connect等函式並不屬於svid。取而代之的是xti(x/open transport inte***ce)是由x/open開發的tli(trasnport layer inte***ce)的乙個擴充套件。tli則是由at&t開發的一套api。在舊版本的mac os上寫過網路**的mac os工程師或許會對這些函式比較熟悉,因為tli和xti曾經是opentransport網路api的基礎。tli/xti的乙個優點是傳輸無關的。

這個類別包含了100多個能在iso標準c庫里找到的函式,包括glob、drand48、nrand48、bsearch、catgets、gets、puts、fgets、fputs、getopt、printf、putchar、getc、sprintf、sscanf

xpg是由x/open開發的一系列標準,bsd(berkeley standard distribution)包括sockets以及相關api。

第乙個要在gcc中加的引數或許就是-ansi和-pendantic。-ansi引數令gcc嚴格遵守ansi/iso c語言標準,並且移除所有的gnu擴充套件。-pendantic引數則令gcc拒絕接受任何不符合標準的**。省略這個引數不會禁止你在呼叫定義在c庫里符合標準的函式,但是它能幫助你避免誤用api,例如像庫里(庫里躺槍)的函式傳遞了錯誤型別的引數。

-wall引數一定要在命令列的引數裡,編寫可移植**第一步就是編寫正確的**

接下來就是要包含定義了呼叫函式的標頭檔案,如果使用率-ansi和-pendantic標誌的話,這就是必須的步驟。可以通過終端視窗或者google來檢視man(1)page確定應該包含哪些標頭檔案,通常在synopsis一節中找到

atof(3) system library fuctions manual atof(3)

name

atof -convertassii

string to double

library

standardc library(libc,-lc)

synopsis

#inclue

double

atof(const

char * nptr)

所以要使用atof()函式,就需要以如下的方式包含

#include
在c++裡也ok,但是c++推薦的用法是只包含檔名而去除字尾.h.如下

#include
gcc提供的標頭檔案不需要包含多次,而且包含順序也麼有影響。

命令列引數-ansi令只接受iso/ansi的特性。若要使用posix或svid支援的介面,你需要開啟一些gcc定義的巨集才行,這些巨集應該在每個原始檔的開頭指定任何標頭檔案之前定義。這樣巨集就能被c預處理器正確處理,進而影響到gnu提供的標頭檔案裡哪些函式、常量、巨集的宣告和定義可以在你的**裡出現。還可以在makefile裡用-d命令列選項來定義這些巨集,不過gnu文件推薦的方式是直接在原始檔裡包含它們。

下面的**來自

typedef

void *dir

#define _posix_source 1 … #include

那麼下列語句就回定義dir型別

不然dir就會在#else語句裡定義:

#include

#ifdef _posix_source

typedef void *dir;

#else

#define d_ino d_fileno

#define dirblksiz 1024

typedef struct _dirdesc dir;

#define drifd(dirp)((dirp)->dd_fd)

#define dif_hidew 0x0001

#define dtf_nodup 0x0002

#define dtf_rewind 0x0004

#define _dtf_readall ox0008

#ifndef null

#define null 0

#endif

#endif

這是和之前討論的標準相關的gcc所支援的巨集的列表

建立檔案的api展示了win2、posix和windows nt系統如何協同工作的。在win32下,建立檔案的函式是createfile,在posix api裡則是creat()函式。這兩個函式功能一模一樣,把接受的引數按需要處理後,再傳給windows nt的ntcreatefile()函式

ntcreatefile(

out phandle filehandle,

in access_mask desiredaccess,

in pobject_attributes objectattributes,

out pio_status_block iostatusblock,

in plarge_integer allocationsize optional,

inulong fileattributes,

inulong shareaccess,

inulong createdisposition,

inulong createoptions,

in pvoid eabuffer optional,

inulong ealength );

不過上面**有點系小問題。posix的creat()並不存在與微軟的執行庫中,而是以_creat()形式出現的。在微軟rtl裡的posix函式都是這種命名規則,_dup()、_fdopen()等。這麼做的意思是如果不使用一些巨集和封裝來吧乙個版本裡的函式對映到另乙個版本上的話,這些函式都是不可移植的。

微軟rtl的文件為open函式新增了o_binary、o_text和其他一些沒有在posix定義的標誌位,它還不支援o_shilock和o_exlock。

還有一些為mac os x和linux編寫的posix**無須修改就可以移植到windows上的。最好還是盡量用通用的部分編寫**,並且充分測試保證執行的相容性

c 11 thread跨平台使用的簡單例項

std thread是c 11新引入的執行緒標準庫,通過其可以方便的編寫與平台無關的多執行緒程式,雖然對比針對平台來定製化多執行緒庫會使效能達到最大,但是會喪失了可移植性。在使用std thread的時候,對建立的執行緒有兩種操作 等待 分離,也就是join detach操作。join 操作是在st...

C 標準庫中 string 使用的優化技術

往容器中新增元素,若是要使用移動語義,一樣的使用 std move.int main std cout int s.c str n std vectorvec vec.push back std move s std cout int vec 0 c str return 0 得到的位址卻不一樣,說...

使用c 11寫個最簡跨平台執行緒池

為什麼需要多執行緒?最簡單的多執行緒長啥樣?為什麼需要執行緒池,有什麼問題?實現的主要原理是什麼?帶著這幾個問題,我們依次展開。1.為什麼需要多執行緒?大部分程式畢竟都不是計算密集型的,簡單的說,正常情況下,以單執行緒的模式來寫對程式設計師而言是最舒心的。因為所有的 都是順序執行,非常容易理解!函式...