Linux实现函数和全局变量的#ifdef功能

来源:互联网 发布:北京哪里体检好 知乎 编辑:程序博客网 时间:2024/06/11 03:05
 

 大家都知道,我们可以用#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那样, 是在编译时。