国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設(shè)計 > 正文

c編程最佳實踐

2019-11-17 05:15:30
字體:
供稿:網(wǎng)友

  盡管 C 語言問世已近 30 年,但它的魅力仍未減退。C 語言繼續(xù)吸引著眾多的人們,他們?yōu)榱司帉懶碌膽?yīng)用程序,或者移植或維護現(xiàn)有的應(yīng)用程序而必須學習新技能。

簡介

本文是為了滿足開發(fā)人員的需要而寫的。我們總結(jié)了一套指南,無論作為開發(fā)人員還是顧問,這些指南多年來一直都很好地指導著我們,我們把它們作為建議提供給您,希望對您的工作有所幫助。您也許不贊同其中的某些指南,但我們希望您會喜歡其中的一些并在您的編程或移植項目中使用它們。

風格與指南

l 使用一種使代碼具有可讀性和一致性的源代碼風格。假如沒有團隊代碼風格或自己的風格,您可以使用與大多數(shù) C 程序員采用的 Kernighan 和 Ritchie 風格相似的風格。然而,舉一個極端的例子,有可能最終會寫出與下面相似的代碼:

int i;main(){for(;i["]
o, world!/n",'/'/'/'));}read(j,i,p){write(j/p+p,i---j,i/i);

— 1984 年模糊 C 代碼大賽“差勁獎”。應(yīng)代碼作者要求匿名。

l 通常將主例程定義為 main()。對應(yīng)的 ANSI 編寫方式是 int main(void)(假如不考慮命令行參數(shù)的話)或 int main( int argc, char **argv )。ANSI 以前的編譯器會省略 void聲明,或列出變量名以及緊隨其后的聲明。

l 空格

充分利用水平和垂直空格。縮進和空格間距應(yīng)反映出代碼的塊結(jié)構(gòu)。

應(yīng)將條件運算符的長字符串分割成單獨的幾行。例如:



if (foo->next==NULL && number < limit && limit <=SIZE

&& node_active(this_input)) {...



最好改成:



if (foo->next == NULL

&& number < limit && limit <= SIZE

&& node_active(this_input))

{

...



同樣,應(yīng)將描述得很具體的 for 循環(huán)分割成不同的行:



for (curr = *varp, trail = varp;

curr != NULL;

trail = &(curr->next), curr = curr->next )

{

...



對于其它復雜表達式(如使用三元運算符 ?:的表達式),最好也將其分割成數(shù)行。



z = (x == y)

? n + f(x)

: f(y) - n;





l 注釋

注釋應(yīng)描述正在發(fā)生什么事、如何完成它、參數(shù)表示什么、使用了哪些全局變量以及任何限制或錯誤。但要避免不必要的注釋。假如代碼比較清楚,并且使用了良好的變量名,那么它應(yīng)該能夠較好地說明自身。因為編譯器不檢查注釋,所以不保證它們是正確的。與代碼不一致的注釋會起到相反的作用。過多的注釋會使代碼混亂。

下面是一種多余的注釋風格:



i=i+1; /* Add one to i */



很明顯變量 i遞增了 1。還有更糟的注釋方法:





/************************************

* *

* Add one to i *

* *

************************************/



i=i+1;



l 命名約定

具有前導和尾隨下劃線的名稱是為系統(tǒng)用途而保留的,不應(yīng)當用于任何用戶創(chuàng)建的名稱。約定規(guī)定:

1. #define 常量應(yīng)全部大寫。

2. enum 常量應(yīng)以大寫字母開頭或全部大寫。

3. 函數(shù)、類型定義(typedef)和變量名以及結(jié)構(gòu)(strUCt)、聯(lián)合(union)和枚舉(enum)標記名稱應(yīng)小寫。


為清楚起見,避免使用僅在大小寫上有區(qū)別的名稱,如 foo 和 Foo。同樣,避免使用 Foobar 和 foo_bar 這樣的名稱。避免使用看上去相似的名稱。在許多終端和打印機上,“l(fā)”、“1”和“I”看上去非常相似。使用名為“l(fā)”的變量非常不明智,因為它看上去非常象常量“1”。



l 變量名

選擇變量名時,長度不重要,但清楚的表達很重要。長名稱可用于全局變量,因為它不常用,而將在每行循環(huán)上要使用的數(shù)組下標命名為 i 就完全夠了。假如使用“index”或“elementnumber”的話,不僅輸入得更多,而且會使計算的細節(jié)不明確。假如使用長變量名,有時候會使代碼更難理解。比較:





for(i=0 to 100)

array[i]=0









for(elementnumber=0 to 100)

array[elementnumber]=0;



l 函數(shù)名

函數(shù)名應(yīng)反映函數(shù)執(zhí)行什么操作以及返回什么內(nèi)容。函數(shù)在表達式中使用,通常用于 if子句,因此它們的意圖應(yīng)一目了然。例如:





if (checksize(x))



沒有幫助作用,因為它沒有告訴我們 checksize 是在出錯時返回 true 還是在不出錯時返回 true;而



if (validsize(x))



則使函數(shù)的意圖很明確。

l 聲明

所有的外部數(shù)據(jù)聲明前都應(yīng)加上 extern要害字。

“指針”限定符“*”應(yīng)緊鄰變量名而不是類型。例如,應(yīng)使用





char *s, *t, *u;



而不是



char* s, t, u;



后一條語句沒有錯,但可能不是我們期望的,因為沒有將“t”和“u”聲明為指針。

l 頭文件

頭文件應(yīng)按功能組織在一起,即,對單獨子系統(tǒng)的聲明應(yīng)在單獨的頭文件中。此外,當代碼從一個平臺移植到另一個平臺時有可能發(fā)生更改的聲明應(yīng)位于單獨的頭文件中。



避免使用與庫頭文件名相同的專用頭文件名。語句 #include "math.h" 假如在當前目錄中找不到所期望文件的話,會包括標準庫 math 頭文件。假如這是您期望的結(jié)果,可以注釋掉這行 include 語句。



最后說明一點,對頭文件使用絕對路徑名不是一個好主意。C 編譯器的“include-path”選項(在許多系統(tǒng)上為 -I — 大寫的 i)是處理眾多專用頭文件庫的首選方法;它答應(yīng)在不改變源文件的情況下重新組織目錄結(jié)構(gòu)。

l scanf

在重要的應(yīng)用程序中永遠不要使用 scanf。它的錯誤檢測不夠完善。請看下面的示例:





#include



int main(void)

{

int i;

float f;




scanf("%d %f", &i, &f);



printf("I read %d and %f/n", i, f);

return 0;

}



測試運行

Enter an integer and a float: 182 52.38

I read 182 and 52.380001

另一個測試運行

Enter an integer and a float: 6713247896 4.4

I read -1876686696 and 4.400000

l ++ 和 --

當對語句中的變量使用遞增或遞減運算符時,該變量不應(yīng)在語句中出現(xiàn)一次以上,因為求值的順序取決于編譯器。編寫代碼時不要對順序作假設(shè),也不要編寫在某一機器上能夠如期運作但沒有明確定義的行為的代碼:



int i = 0, a[5];



a[i] = i++; /* assign to a[0]? or a[1]? */




l 不要被表面現(xiàn)象迷惑

請看以下示例:





while (c == '/t' c = ' ' c == '/n')

c = getc(f);



乍一看, while子句中的語句似乎是有效的 C 代碼。但是,使用賦值運算符而不是比較運算符卻產(chǎn)生了語義上不正確的代碼。= 的優(yōu)先級在所有運算符中是最低的,因此將以下列方式解釋該語句(為清楚起見添加了括號):



while ((c == '/t' c) = (' ' c == '/n'))

c = getc(f);



賦值運算符左邊的子句是:



(c == '/t' c)



它不會產(chǎn)生左值。假如 c 包含制表符,則結(jié)果是“true”,并且不會執(zhí)行進一步的求值,而“true”不能位于賦值表達式的左邊。

l 意圖要明確。

當您編寫的代碼可以解釋成另一種意圖時,使用括號或用其它方法以確保您的意圖清楚。假如您以后必須處理該程序的話,這有助于您理解您當初的意圖。假如其他人要維護該代碼,這可以讓維護任務(wù)變得更簡單。

用能預(yù)見可能出現(xiàn)錯誤的方式編碼,有時是可行的。例如,可以將常量放在比較等式的左邊。即,不編寫:



while (c == '/t' c == ' ' c == '/n')

c = getc(f);



而是編寫:



while ('/t' == c ' ' == c '/n' == c)

c = getc(f);



用以下方法卻會得到編譯器診斷:



while ('/t' = c ' ' == c '/n' == c)

c = getc(f);



這種風格讓編譯器發(fā)現(xiàn)問題;上面的語句是無效的,因為它試圖對“/t”賦值。

l 意想不到的麻煩。

各種 C 實現(xiàn)通常在某些方面各有不同。堅持使用語言中可能對所有實現(xiàn)都是公共的部分會有幫助。通過這樣做,您更輕易將程序移植到新的機器或編譯器,并且不大會碰到編譯器非凡性所帶來的問題。例如,考慮字符串:



/*/*/2*/**/1



這里利用了“最大適合(maximal munch)”規(guī)則。假如可以嵌套注釋,則可將該字符串解釋為:

/* /* /2 */ * */ 1



兩個 /* 符號與兩個 */ 符號匹配,因此該字符串的值為 1。假如注釋不嵌套,那么在有些系統(tǒng)上,注釋中的 /* 就被忽略。在另一些系統(tǒng)上會針對 /* 發(fā)出警告。無論哪種情況,該表達式可解釋為:



/* / */ 2 * /* */ 1



2 * 1 求值得 2。

l 清空輸出緩沖區(qū)

當應(yīng)用程序異常終止時,其輸出的尾部經(jīng)常會丟失。應(yīng)用程序可能沒有機會完全清空它的輸出緩沖區(qū)。輸出的某一部分可能仍在內(nèi)存中,并且永遠不會被寫出。在有些系統(tǒng)上,這一輸出可能有幾頁長。

以這種方式丟失輸出會使人誤解,因為它給人的印象是程序在它實際失敗很久之前就失敗了。解決這一問題的方法是強制將輸出從緩沖區(qū)清除,非凡是在調(diào)試期間。確切的方法隨系統(tǒng)的不同而有所不同,不過也有常用的方法,如下所示:



setbuf(stdout, (char *) 0);



必須在將任何內(nèi)容寫到標準輸出之前執(zhí)行該語句。理想情況下,這將是主程序中的第一條語句。

l getchar() — 宏還是函數(shù)

以下程序?qū)⑵漭斎霃椭频狡漭敵觯?br />




#include



int main(void)

{

register int a;



while ((a = getchar()) != EOF)

putchar(a);

}



從該程序除去 #include 語句將使該程序無法編譯,因為 EOF 將是未定義的。

我們可以用以下方法重新編寫該程序:





#define EOF -1



int main(void)

{

register int a;




while ((a = getchar()) != EOF)

putchar(a);

}



這在許多系統(tǒng)上都可行,但在有些系統(tǒng)上運行要慢很多。

因為函數(shù)調(diào)用通常要花較長時間,所以經(jīng)常把 getchar實現(xiàn)為宏。這個宏定義在 stdio.h中,所以當除去 #include 時,編譯器就不知道 getchar 是什么。在有些系統(tǒng)上,假設(shè) getchar 是返回一個 int的函數(shù)。

實際上,許多 C 實現(xiàn)在其庫中都有 getchar函數(shù),部分原因是為了防止這樣的失誤。于是,在 #include 遺漏的情況下,編譯器使用 getchar的函數(shù)版本。函數(shù)調(diào)用的開銷使程序變慢。 putchar有同樣的問題。

l 空指針

空指針不指向任何對象。因此,為了賦值和比較以外的目的而使用空指針都是非法的。

不要重新定義 NULL 符號。NULL 符號應(yīng)始終是常量值零。任何給定類型的空指針總是等于常量零,而與值為零的變量或與某一非零常量的比較,其行為由實現(xiàn)定義。

反引用 null 指針可能會導致希奇的事情發(fā)生。

l a+++++b 表示什么?

解析它的唯一有意義的方法是:



a ++ + ++ b



然而,“最大適合”規(guī)則要求將它分解為:



a ++ ++ + b



這在語法上是無效的:它等于:



((a++)++) + b



但 a++ 的結(jié)果不是 左值,因此作為 ++ 的操作數(shù)是不可接受的。于是,解析詞法不明確性的規(guī)則使得以語法上有意義的方式解析該示例變得不可能。當然,謹慎的辦法實際上是在不能完全確定它們的意義的情況下,避免這樣的構(gòu)造。當然,添加空格有助于編譯器理解語句的意圖,但(從代碼維護的角度看)將這一構(gòu)造分割成多行更可取:



++b;

(a++) + b;



l 小心處理函數(shù)

函數(shù)是 C 中最常用的結(jié)構(gòu)概念。它們應(yīng)用于實現(xiàn)“自頂向下的”問題解決方法 — 即,將問題分解成越來越小的子問題,直到每個子問題都能夠用代碼表示。這對程序的模塊化和文檔記錄有幫助。此外,由許多小函數(shù)組成的程序更易于調(diào)試。

假如有一些函數(shù)參數(shù)還不是期望的類型,則將它們強制轉(zhuǎn)換為期望的類型,即使您確信沒有必要也應(yīng)該這樣做,因為(假如不轉(zhuǎn)換的話)它們可能在您最意料不到的時候給您帶來麻煩。換句話說,編譯器通常將函數(shù)參數(shù)的類型提升和轉(zhuǎn)換成期望的數(shù)據(jù)類型以符合函數(shù)參數(shù)的聲明。但是,在代碼中以手工方式這樣做可以清楚地說明程序員的意圖,并且在將代碼移植到其它平臺時能確保有正確的結(jié)果。

假如頭文件未能聲明庫函數(shù)的返回類型,那就自己聲明它們。用 #ifdef/#endif 語句將您的聲明括起來,以備代碼被移植到另一個平臺。

函數(shù)原型應(yīng)當用來使代碼更健壯,使它運行得更快。

l 懸空 else

除非知道自己在做什么,否則應(yīng)避免“懸空 else”問題:





if (a == 1)

if (b == 2)

printf("***/n");

else

printf("###/n");





規(guī)則是 else 附加至最近的 if。當有疑慮時,或有不明確的可能時,添加花括號以說明代碼的塊結(jié)構(gòu)。

l 數(shù)組界限

檢查所有數(shù)組的數(shù)組界限,包括字符串,因為在您現(xiàn)在輸入“fubar”的地方,有人可能會輸入“floccinaucinihil
ipilification”。健壯的軟件產(chǎn)品不應(yīng)使用 gets()。

C 下標以零作為開始的這一事實使所有的計數(shù)問題變得更簡單。然而,把握如何處理它們需要花些努力。

l 空語句

for 或 while 循環(huán)的空語句體應(yīng)當單獨位于一行并加上注釋,這樣就表明這個空語句體是有意放置的,而不是遺漏了代碼。



while (*dest++ = *src++)

; /* VOID */



l 測試真(true)還是假(false)

不要以缺省方式測試非零值,即:



if (f() != FAIL)



優(yōu)于



if (f())



盡管 FAIL 的值可能是 0(在 C 中視為假(false))。(當然,應(yīng)當在這一風格與“函數(shù)名”一節(jié)中演示的構(gòu)造之間作出權(quán)衡。)當以后有人認為失敗的返回值應(yīng)該是 -1 而不是 0 時,顯式的測試對您會有幫助。


常見的問題是使用 strcmp 函數(shù)測試字符串是否相等,決不應(yīng)該以缺省方式處理它的結(jié)果。更可取的方法是定義宏 STREQ:



#define STREQ(str1, str2) (strcmp((str1), (str2)) == 0)



用這種方法,語句



If ( STREQ( inputstring, somestring ) ) ...



就具有隱含的行為,該行為不大會在您不知情的情況下改變(人們往往不會重新編寫或重新定義象 strcmp()這樣的標準庫函數(shù))。

不要用 1 檢查相等性的布爾值(TRUE 和 YES 等);而要用 0 測試不等性(FALSE 和 NO 等)。絕大多數(shù)函數(shù)被確保在條件為假(false)時返回 0,但僅在條件為真(true)時才返回非零。因此,最好將



if (func() == TRUE) {...



寫成



if (func() != FALSE)



l 嵌入語句

使用嵌入賦值語句要看時間和地點。在有些構(gòu)造中,假如不使用更多且不易閱讀的代碼就沒有更好的方法來實現(xiàn)結(jié)果:



while ((c = getchar()) != EOF) {

process the character

}



使用嵌入賦值語句來提高運行時性能是可能的。但是,您應(yīng)當在提高速度和降低可維護性之間加以權(quán)衡,在人為指定的位置使用嵌入賦值語句會導致可維護性降低。例如:



x = y + z;

d = x + r;



不應(yīng)被替換為:



d = (x = y + z) + r;



即使后者可能節(jié)省一個周期也不行。最終,這兩者之間在運行時間上的差異將隨著優(yōu)化器的增強而減少,易維護性的差異卻將增加。

l goto 語句

應(yīng)保守地使用 goto。從數(shù)層 switch、 for和 while嵌套中跳出來時,使用該語句很有效,不過,假如有這樣的需要,則表明應(yīng)將內(nèi)部構(gòu)造分解成單獨的函數(shù)。



for (...) {

while (...) {

...

if (wrong)

goto error;



}

}

...

error:

print a message



當必須使用 goto時,隨附的標號應(yīng)單獨位于一行,并且同后續(xù)代碼的左邊相距一個制表符或位于一行的開頭。對 goto語句和目標都應(yīng)加上注釋,說明其作用和目的。

l switch 中的“落空”(fall-through)

當一塊代碼有數(shù)個標號時,將這些標號放在單獨的行。這種風格與垂直空格的使用一致,并且使重新安排 case 選項(假如那是必需的話)成了一項簡單的任務(wù)。應(yīng)對 C switch 語句的“落空”特征加以注釋,以便于以后的維護。假如這一特性曾給您帶來“麻煩”,那么您就能夠理解這樣做的重要性!



switch (eXPr) {

case ABC:

case DEF:

statement;

break;

case UVW:

statement; /*FALLTHROUGH*/

case XYZ:

statement;

break;

}



盡管從技術(shù)上說,最后一個 break 不是必需的,但是,假如以后要在最后一個 case 之后添加了另一個 case,那么一致地使用 break 可以防止“落空”錯誤。假如使用 default case 語句的話, 它應(yīng)當永遠是最后一個,并且(假如它是最后的語句)不需要最后的 break 語句。

l 常量

符號常量使代碼更易于閱讀。應(yīng)盡量避免使用數(shù)字常量;使用 C 預(yù)處理器的 #define 函數(shù)給常量賦予一個有意義的名稱。在一個位置(最好在頭文件中)定義值還會使得治理大型程序變得更輕易,因為只需更改定義就可以統(tǒng)一地更改常量值。可以考慮使用枚舉數(shù)據(jù)類型作為對聲明只取一組離散值的變量的改進方法。使用枚舉還可以讓編譯器對您枚舉類型的任何誤用發(fā)出警告。任何直接編碼的數(shù)字常量必須至少有一個說明值的出處的注釋。


常量的定義與它的使用應(yīng)該一致;例如,將 540.0 用于浮點數(shù),而不要通過隱式浮點類型強制轉(zhuǎn)換使用 540。也就是說,在有些情況下,常量 0 和 1 可以以本身的形式直接出現(xiàn),而不要以定義的形式出現(xiàn)。例如,假如某個 for循環(huán)遍歷一個數(shù)組,那么:



for (i = 0; i < arraysub; i++)



非常合理,而代碼:



gate_t *front_gate = opens(gate[i], 7);

if (front_gate == 0)

error("can't open %s/n", gate[i]);



就不合理。在第二個示例中,front_gate 是指針;當值是指針時,它應(yīng)與 NULL 比較而不與 0 比較。即使象 1 或 0 這樣的簡單值,通常最好也使用象 TRUE 和 FALSE 這樣的定義來表示(有時 YES 和 NO 讀起來更清楚)。

不要在需要離散值的地方使用浮點變量。這是由于浮點數(shù)不精確的表示決定的(請參閱以上 scanf中的第二個測試)。使用 <= 或 >= 測試浮點數(shù);精確比較(== 或 !=)也許不能檢測出“可接受的”等同性。

應(yīng)將簡單的字符常量定義為字符文字而不是數(shù)字。不提倡使用非文本字符,因為它們是不可移植的。假如必須使用非文本字符,尤其是在字符串中使用它們,則應(yīng)使用三位八進制數(shù)(不是一個字符)的轉(zhuǎn)義字符(例如“/007”)來編寫它們。即便如此,這樣的用法應(yīng)視為與機器相關(guān),并且應(yīng)按這一情況來處理。

l 條件編譯

條件編譯可用于機器相關(guān)性、調(diào)試以及在編譯時設(shè)置某些選項。可以用無法預(yù)料的方式輕易地組合各種控制。假如將 #ifdef 用于機器相關(guān)性,應(yīng)確保當沒有指定機器時會出錯,而不是使用缺省的機器。#error 偽指令可以較方便地用于這一用途。假如使用 #ifdef 進行優(yōu)化,缺省值應(yīng)是未優(yōu)化的代碼而不是不可編譯或不正確的程序。要確保對未優(yōu)化的代碼進行了測試。



其它

l 象 Make這樣用于編譯和鏈接的實用程序極大簡化了將應(yīng)用程序從一個環(huán)境移到另一個環(huán)境的任務(wù)。在開發(fā)期間, make僅對那些自上次使用 make 以來發(fā)生了更改的模塊進行重新編譯。

l 經(jīng)常使用 lint。 lint是 C 程序檢查器,它檢查 C 源文件以檢測并報告函數(shù)定義和調(diào)用之間類型的不匹配和不一致,以及可能存在的程序錯誤等。

l 此外,研究一下編譯器文檔,了解那些使編譯器變得“吹毛求疵”的開關(guān)。編譯器的工作是力求精確,因此通過使用適當?shù)拿钚羞x項讓它報告可能存在的錯誤。

l 使應(yīng)用程序中全局符號的數(shù)量最少。這樣做的好處之一是與系統(tǒng)定義的函數(shù)沖突的可能性降低。

l 許多程序在遺漏輸入時會失敗。對所有的程序都應(yīng)進行空輸入測試。這也可能幫助您理解程序的工作原理。

l 不要對您的用戶或您所用的語言實現(xiàn)有任何過多的假設(shè)。那些“不可能發(fā)生”的事情有時的確會發(fā)生。健壯的程序可以防范這樣的情形。假如需要找到某個邊界條件,您的用戶將以某種方式找到它!

l 永遠不要對給定類型的大小作任何假設(shè),尤其是指針。

l 當在表達式中使用 char類型時,大多數(shù)實現(xiàn)將它們當作無符號類型,但有些實現(xiàn)把它們作為有符號的類型。當在算術(shù)表達式使用它們時,建議始終對它們進行類型強制轉(zhuǎn)換。

l 不要依靠對自動變量和 malloc返回的內(nèi)存進行的初始化。

l 使您程序的目的和結(jié)構(gòu)清楚。

l 要記住,可能會在以后要求您或別的人修改您的代碼或在別的機器上運行它。細心編寫您的代碼,以便能夠?qū)⑺浦驳狡渌鼨C器。



結(jié)束語

應(yīng)用程序的維護要花去程序員的大量時間,這是眾所周知的事。部分原因是由于在開發(fā)應(yīng)用程序時,使用了不可移植和非標準的特性,以及不令人滿足的編程風格。在本文中,我們介紹了一些指南,多年來它們一直給予我們很大幫助。我們相信,只要遵守這些指南,將可以使應(yīng)用程序維護在團隊環(huán)境中變得更輕易。

參考資料

l Obfuscated C and Other Mysteries,由 Don Libes 編寫,John Wiley and Sons, Inc. ISBN 0-471-57805-3

l The C Programming Language,Second Edition,由 Brian W. Kernighan 和 Dennis M. Ritchie 撰寫,Prentice-Hall,ISBN 0-13-110370-9

l Safer C,由 Les Hatton 編寫,McGraw-Hill,ISBN 0-07-707640-0

l C Traps and Pitfalls 由 Andrew Koenig 編寫,AT&T Bell Laboratories,ISBN 0-201-17928-9

作者簡介

Shiv Dutta 是 IBM Systems Group 的一名技術(shù)顧問,他幫助獨立軟件供給商在 pSeries 服務(wù)器啟用他們的應(yīng)用程序。Shiv 有作為軟件開發(fā)人員、系統(tǒng)治理員和講師的豐富經(jīng)驗。他在 AIX 的系統(tǒng)治理、問題確定、性能調(diào)優(yōu)和規(guī)模指導方面提供支持。Shiv 在 AIX 誕生之時就從事這方面的工作。他從 Ohio University 獲得物理博士學位,可以通過 sdutta@us.ibm.com與他聯(lián)系。


Gary R. Hook 是 IBM 的高級技術(shù)顧問,為獨立軟件供給商提供給用程序開發(fā)、移植和技術(shù)援助。Hook 先生的職業(yè)經(jīng)歷主要在基于 Unix 的應(yīng)用程序開發(fā)方面。在 1990 年加入 IBM 時,他在位于得克薩斯州 Southlake 的 AIX Technical Support 中心工作,為客戶提供咨詢和技術(shù)支持服務(wù),重點在 AIX 應(yīng)用程序體系結(jié)構(gòu)方面。Hook 先生現(xiàn)在居住在奧斯汀,在 1995 到 2000 年期間,他是 AIX Kernel Development 團隊的一員,專門研究 AIX 鏈接程序、裝入程序和通用應(yīng)用程序開發(fā)工具。可以通過 ghook@us.ibm.com與他聯(lián)系。

上一篇:下面的源碼中搬掉僵尸

下一篇:ASPDotNet

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 武义县| 梁平县| 柳江县| 绥化市| 婺源县| 抚顺县| 武安市| 商水县| 蒲江县| 大连市| 大新县| 大渡口区| 宁德市| 龙口市| 庆安县| 宣武区| 黎城县| 略阳县| 北辰区| 平陆县| 清新县| 耿马| 富民县| 齐齐哈尔市| 云南省| 大埔区| 姜堰市| 建瓯市| 康马县| 新营市| 蒙城县| 仁化县| 樟树市| 通海县| 杭锦后旗| 平和县| 师宗县| 油尖旺区| 新沂市| 敖汉旗| 阿巴嘎旗|