大家都知道,我们可以用#ifdef来检测这个宏存在与否,分别在不同的处理,比如:
int main()
{
#ifdef __FOO
printf("Defined!\n");
#else
printf("Not defined");
#endif
return 0;
}
如果__FOO在前面定义了,那么就输出Defined!,否则就输出Not defined.
但如果是函数呢, 比如printf被定义了, 我就用printf来输出, 否则我就用myprintf来输出, 该怎么实现呢。
这里就介绍一个称为弱符号的方法,来实现这个功能。
先来看一段代码:
static void myprintf(const char* format, ...)
{
.....
}
int printf(const char *format, ...) __attribute__ ((weak));
int main()
{
if (printf)
printf("I am printf!\n");
else
myprintf("I am myprintf!\n");
return 0;
}
注意粗体部分是把printf声明成了一个弱符号,这样, 当标准库去掉printf后,
就会执行myprintf("I am myprintf!\n");
printf没被去掉的话,就执行printf("I am printf!\n");
如果函数后面没有加上__attribute__ ((weak))的话, 那么就是强符号,
强符号的函数就必须要实现, 否则在链接时会报"undefined reference to xxx",
全局变量也类似。
当然, 这个功能是在运行时实现的,而不是#ifdef那样, 是在编译时。