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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值