2012-12-24 22 views
5

Bir başlık dosyasında önceden tanımlanmış bir .c dosyasındaki bir işlevin yeniden tanımlanmasına izin vermek istiyorum. Yapmak istediğim tam olarak ne gibi seslerBu zayıf kullanım mı?

The effect is equivalent to moving all references to the alias to a separate translation unit, renaming the alias to the aliased symbol, declaring it as weak, compiling the two separate translation units and performing a reloadable link on them.

: weakref özellik hakkında GCC kılavuzuna göre. Ancak, aşağıdaki örnekte hata ile derleme değil: bunu doğru kullanıyor muyum

tpp.c:18:13: error: redefinition of ‘foo’ tpp.c:6:13: note: previous definition of ‘foo’ was here

#include <sys/types.h> 
#include <stdio.h> 

/* this will be in a header file */ 
static void foo(void) __attribute__ ((weakref ("_foo"))); 

static void _foo(void) 
{ 
    printf("default foo\n"); 
} 

/* in a .c file #including the header mentioned above */ 
#define CUSTOM_FOO 

#ifdef CUSTOM_FOO 
static void foo(void) 
{ 
    printf("user defined foo.\n"); 
} 
#endif 

int main(int argc, char **argv) 
{ 
    printf("calling foo.\n"); 
    foo(); 
} 

? Neyi kaçırıyorum?

gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)

cevap

1

Bildiğim kadarıyla sen extern olarak bu işlevi tanımlamak gerektiğini anlamak gibi.

[email protected]:$ cat weakref.c 

#include <sys/types.h> 
#include <stdio.h> 

/* this will be in a header file */ 
extern void foo(void) __attribute__ ((weak, alias ("_foo"))); 

void _foo(void) 
{ 
    printf("default foo\n"); 
} 

int main(int argc, char **argv) 
{ 
    printf("calling foo.\n"); 
    foo(); 
} 

[email protected]:$ gcc weakref.c 
[email protected]:$ ./a.out 
calling foo. 
default foo 
[email protected]:$ cat weakrefUser.c 
#include <stdio.h> 
/* in a .c file #including the header mentioned above */ 
#define CUSTOM_FOO 

#ifdef CUSTOM_FOO 
void foo(void) 
{ 
    printf("user defined foo.\n"); 
} 
#endif 
[email protected]:$ gcc -c weakrefUser.c 
[email protected]:$ gcc -c weakref.c 
[email protected]:$ gcc weakref.o weakrefUser.o 
[email protected]:$ ./a.out 
calling foo. 
user defined foo. 

Not 1: şu şekildedir: O halde benim için çalışmak Zayıf özelliği için küresel olmak gerekir, statik fonksiyonları ile çalışmaz.

Not2: Zayıf semboller, ELF hedefleri için "yalnızca" desteklenir.

+0

'zayıf' ve 'zayıf' iki farklı şeydir (https://gcc.gnu.org/onlinedocs/gcc-4.9.4/gcc/Function-Attributes.html#Function-Attributes). Soru 'zayıf' ile ilgili ve 'zayıf' kullanarak cevapladınız. – Nawaz