2016-10-25 40 views
0

如果可用,我會使用​​函數。從手冊頁代碼:如何使用Glibc功能測試宏?

#define _GNU_SOURCE    /* See feature_test_macros(7) */ 
    #include <pthread.h> 
    int pthread_setname_np(pthread_t thread, const char *name); 
    int pthread_getname_np(pthread_t thread, 
          char *name, size_t len); 

它是安全的只是做這樣的(不包括沒有定義):包括不需要

#ifdef _GNU_SOURCE 
    pthread_setname_np(pthread_self(), "mythread"); 
#endif 

因爲C++ #include <thread>,我使用似乎拉pthreads_GNU_SOURCE始終在libstdc++中啓用,如果它被禁用 - 代碼將仍然編譯。

我錯過了什麼嗎?

+1

您是否閱讀過[feature_test_macros(7)](http://man7.org/linux/man-pages/man7/feature_test_macros.7.html)? –

+0

@BasileStarynkevitch,是的。它關於控制標準庫提供的內容。我對激活我的程序功能感興趣,具體取決於構建的方式。 – Velkan

+0

看來這個問題被標記爲'c',但實際問題討論了'C++'。這些是不同的語言。請選擇一個。 – user3629249

回答

4

它是安全的只是做這樣的(不包括沒有定義):

是。只要您包含<pthread.h>就可以了,它提供了​​的原型。

包含是不需要的,因爲我使用的C##include似乎拉pthreads。

libc++使用下面的pthreads庫。所以,它適用於pthread.h。但是,這並不意味着如果包含<thread>,則不需要pthread.h。如果libc++更改實現線程的底層機制呢?所以,通過pthread.h並不安全,只是因爲它碰巧可以通過其他方式獲得。