2011-05-09 27 views
4

當我使用__attribute__ ((weak))就像在this post我收到來自gcc關於重新聲明符號的警告,而我所做的只是添加一個屬性。該屬性可以不同地附加?我得到這個樣子的警告:使用__attribute__((弱))會導致警告「xxx多餘的重新聲明」,以任何方式避免?

threads.c:53: warning: redundant redeclaration of ‘pthread_once’ 
/usr/include/pthread.h:478: note: previous declaration of ‘pthread_once’ was here 
+0

您是否在threads.c中聲明瞭自己的pthread_once版本? – hirschhornsalz 2011-05-09 10:32:13

+0

是的,我做了(爲了添加屬性) #ifdef __GNUC__ #ifdef linux #if(__GNUC__ == 3 && __GNUC_MINOR__> = 3)|| (__GNUC__> 3) extern int pthread_once(pthread_once_t * __ once_control, void(* __ init_routine)(void)) \t __attribute((weak)); ... – ensonic 2011-05-09 10:36:01

+0

然後,你不能#include ,因爲你聲明瞭兩次函數。您可以製作pthread.h的副本,在那裏更改pthread_once的聲明並將其包含在內。 – hirschhornsalz 2011-05-09 10:54:21

回答

3

是 - GCC允許您使用#pragma weak聲明符號爲弱,這樣你就可以做到這一點,而不是:

#include <pthread.h> 

#pragma weak pthread_create 
#pragma weak pthread_mutex_init 
#pragma weak pthread_mutex_lock 
#pragma weak pthread_mutex_unlock 
#pragma weak pthread_mutex_destroy 

/* ... code ... */ 

(記錄在案 here。)
1

您可以使用像http://cgit.freedesktop.org/xcb/pthread-stubs/這樣的pthread存根庫,它避免了創建自己的存根的需要。

如果您只需要在相當現代的系統上運行,libc將爲大多數常用函數提供一組存根,以使線程安全或libpthread集成到libc中。請注意,pthread_once的存根可能無法調用傳遞的函數。 (有些庫使用它來檢測它們是否在線程編程環境或非線程編程環境中。)

相關問題