2012-08-07 45 views
0

我碰到這行代碼今天來用C編程的書的進程和線程章:函數調用之前放置括號的C的結構是什麼?

printf("[Child] child thread id: 0x%x\n", (unsigned int)pthread_self()); 

我從來沒有見過的部分(unsigned int)pthread_self(),我不知道是什麼第一對parenthesises的用於。任何想法?

PS:

我記得的PHP文件中,有類似的表達對函數文檔:

int time()

但在實際的代碼中,我們只使用部分time(),int是爲記錄文件目的以顯示函數的返回值time()


更新:

I型書中的示例代碼,測試每個線程ID:

#include <stdio.h> 
#include <stdlib.h> 
#include <pthread.h> 
#include <sys/types.h> 
#include <unistd.h> 

int global = 5; 

void* ChildCode(void* arg) { 
    int local = 10; 

    global++; 
    local++; 
    printf("[Child] child thread id: 0x%x\n", (unsigned int)pthread_self()); 
    printf("[Child] global: %d local: %d\n", global, local); 

    pthread_exit(NULL); 
} 

int main() { 
    pthread_t childPid; 
    int  local = 10; 

    printf("[At start] global: %d local: %d\n", global, local); 

    /* create a child thread */ 
    if (pthread_create (&childPid, NULL, ChildCode, NULL) != 0) 
    { 
    perror("create"); 
    exit(1); 
    } else { /* parent code */ 
    global++; 
    local--; 
    printf("[Parent] parent main thread id : 0x%x\n", (unsigned int)pthread_self()); 
    printf("[Parent] global: %d local: %d\n", global, local); 
    sleep(1); 
    } 
    printf("[At end] global: %d local: %d\n", global, local); 
    exit(0); 
} 

,它給了我一些注意事項(不警告沒有錯誤):

clang example_thread.c 
/tmp/example_thread-9lEP70.o: In function `main': 
example_thread.c:(.text+0xcc): undefined reference to `pthread_create' 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

我不知道代碼,有什麼想法嗎?

+0

您需要將'-pthread'傳遞給clang。見http://stackoverflow.com/questions/2391194/what-is-gs-pthread-equiv-in-clang – ecatmur 2012-08-07 10:21:48

+0

@ecatmur非常感謝,它的作品。 – mko 2012-08-07 10:24:10

回答

1

括號是的pthread_self返回值鑄造unsigned intpthread_self返回pthread_t,這是一個未指定的算術類型,不適合與printf一起使用。

+0

+1指出它是一個未指定的算術類型 – mko 2012-08-07 10:15:35

+0

'pthread_t'不一定是一個算術類型,或者甚至是一個標量類型,例如它可能是一個巨大的結構。這將是非常低效的,但它是允許的,因此包含這個轉換的代碼是無效的。可移植打印'pthread_t'的唯一方法是將其表示法打印爲'unsigned char [sizeof(pthread_t)]'。 – 2012-08-07 13:29:38

+1

如果你打算假設'pthread_t'是一個標量類型,你應該仍然使用'uintmax_t',而不是'unsigned int'。後者太短而無法表示64位系統上的所有「pthread_t」值。 – 2012-08-07 13:30:37

1

這只是將函數的返回值轉換爲unsigned int

嗎,就像:

pthread_t pthread_self_result; 
pthread_self_result = pthread_self(); 
printf("[Child] child thread id: 0x%x\n", (unsigned int)pthread_self_result); 
+0

感謝您的快速回復,以及您的示例代碼,因此鑄造值是爲printf使用的,不是嗎? – mko 2012-08-07 10:03:05

+0

是的,差不多。 – MByD 2012-08-07 10:10:00

+0

你能幫我檢查一下我爲這個問題更新的錯誤信息,代碼不會編譯 – mko 2012-08-07 10:17:58

1

這就是用C稱爲「類型轉換」 在這裏,我們投了的pthread_t類型爲unsigned int類型進行打印。 請參閱您的C語言手冊

+0

+1來指出「類型轉換」這個詞。對於這個noobie問題抱歉,我應該徹底學習C參考,但對於像我這樣的noob不容易,但我試圖 – mko 2012-08-07 10:14:14

相關問題