浅谈C语言中的强符号、弱符号、强引用和弱引用(2)
#include<stdio.h>
__attribute__((weak)) void func()
{
printf("func()#1\n");
}
代码g.c
#include<stdio.h>
void func()
{
printf("func()#2\n");
}
int main(int argc, char** argv)
{
func();
return 0;
}
~
编译链接,结构输出"func()#2"。
以上可以说明函数和变量是保持一致的,其实对应变量也可以像使用函数那样先判断再使用,只不过不是判断变量的值而是变量的地址,如
代码v1.c
int i = 2;
代码v2.c
#include<stdio.h>
__attribute__((weak)) extern int i;
int main(int argc, char** argv)
{
if (&i)
printf("i = %d\n", i);
return 0;
}
~
编译并链接v1时,输出2;编译但不链接v1时无输出。这样做时要分清定义和声明的区别,__attribute__((weak)) int i 是定义变量并转换为弱符号,这样i是分配了空间的,而__attribute__((weak)) extern int i 则将原来定义的变量i由强符号转换为弱符号,导致使用i时不是强引用而是弱引用。不过虽然变量可以这么做但没有函数那样有意义。
上面关于强弱引用仍旧使用的是GCC提供的__attribute__((weak)),而书中还提到了__attribute__((weakref)),后者貌似更能体现“引用”这一关键词。而我之所以使用前者来介绍强弱引用,是因为我对关于强弱符号与强弱引用对应关系的理解。关于__attribute__((weakref))的使用方法,这里介绍一种(两者都有不同的使用方法)。
代码a.c
#include<stdio.h>
void bar()
{
printf("foo()\n");
}
代码b.c
#include<stdio.h>
static void foo() __attribute__((weakref("bar")));
int main(int argc, char** argv)
{
if (foo)
foo();
return 0;
}
注意函数foo的static修饰符,没有的话会报错,这样将函数foo限制在只有本文件内可使用。
好了,夜已深,写的有点凌乱,我也凌乱了。