精華區beta Programming 關於我們 聯絡資訊
※ 引述《diodio.bbs@bbs.wretch.cc (不愛就轉身離開)》之銘言: > 一個process若要產生新的thread, 可以呼叫pthread_create, 它的prototype如下: > int pthread_create(pthread_t *tid, const pthread_attr_t *attr, > void *(*func)(void *), void *arg); > 我在某書(Comer寫的)上看到一段程式碼,它是這樣寫的: > ... > ... > int TCPechod(int fd); > int ssock; > ... > ... > if(pthread_create(&th, &ta, (void * (*)(void *))TCPechod, > (void *)ssock) < 0) > ... > 我要問的是: > 1.上述 (void * (*)(void *))TCPechod 看起來像是把TCPechod轉型的樣子, > 可是TCPechod這個function的參數以及回傳值本身都是integer, 為什麼可 > 以轉成(void *). > 2.類似1, ssock本身是integer, 被轉成(void *)後會變成什麼; TCPechod裡 > 面的fd的值為什麼等於ssock. > 請各位大大不吝賜教 1. C language 的規定下本來就可以這樣轉, 反之如果你不這樣轉, C compiler 會給你 warning message, C++ compiler 會給你 error message, 因為送進去的 function pointer type 和 pthread_create() 要的不符合。 2. 這是 sizeof(int) == sizeof(void *) 世代裡常見的寫法, 因為兩者等寬, 所以把 int 轉成 void * 再轉回 int 是完全沒有問題的, ssock 並不會因為被轉成 void * 而使得內容有所改變, memory 中所有的 bits 都是完全一致的。 如果你將來會常用 C + pthread, 那就把這些方法學起來也無所謂, 否則最好不要學, 因為這些技巧在現代而言是很糟糕的示範。 -- Name: Tseng, Ling-hua E-mail Address: uranus@it.muds.net School: National Tsing Hua University Department: Computer Science Interesting: C++, Compiler, PL/PD, OS, VM, Large-scale software design Researching: Undecided Homepage: https://it.muds.net/~uranus -- ╔═══╗ ┼────────────────────────╮ 狂狷 Origin:[ 狂 狷 年 少 ] whshs.cs.nccu.edu.tw ╰─╮ 年少 ┼╮ < IP:140.119.164.252 > ╰─╮ ╚╦═╦╝ From:61-230-217-124.dynamic.hinet.net ─╨─╨─ KGBBS 遨翔"BBS"的狂狷不馴;屬於年少的輕狂色彩