2016-10-25 62 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并不安全,只是因为它碰巧可以通过其他方式获得。