免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4571 | 回复: 10

如果库中有同名的函数和宏 功能一样 如何调用 ? [复制链接]

论坛徽章:
0
发表于 2010-04-13 17:24 |显示全部楼层
有些情况用宏   有些状态用函数  

论坛徽章:
0
发表于 2010-04-13 17:31 |显示全部楼层
不大明白lz的意思, 应该是预编译吧
#ifdef FLAG
   FUN();
#else
   fun();
#endif
这样?

论坛徽章:
0
发表于 2010-04-13 18:48 |显示全部楼层
一个写法,两种解释,本来就是歧义嘛。

论坛徽章:
0
发表于 2010-04-13 18:53 |显示全部楼层
本帖最后由 masonzhang 于 2010-04-13 18:59 编辑

比如在 .h 文件中 是这样的

char * foo( args );
#define foo(args)   xxxxxxxxxxxx

关键是宏 不能装到指针里面

#undef 就可以了

论坛徽章:
0
发表于 2010-04-13 19:07 |显示全部楼层
lz要知道宏和函数的区别。
宏是在预编译阶段对代码进行替换,在此之后就再没它的事了。
函数在编译时生成机器码,不检查重复定义,然后在链接时去找对应的函数地址。如果一个函数名有多个定义就会在连接的时候报错。

所以如果宏和函数重名的话,代码在预编译阶段早已被替换掉了。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
发表于 2010-04-13 22:52 |显示全部楼层

  1. int abs(int x);
  2. #define abs(x) ...
复制代码

  1. #undef abs
  2. void f(void) {
  3.       int x = 1212;
  4.       int y = abs(x);
  5.       int (*p)(int) = abs;
  6. }
复制代码

  1. void f(void) {
  2.       int x = 1212;
  3.       int y = abs(x); // macro
  4. }
复制代码

  1. void f(void) {
  2.       int x = 1212;
  3.       int y = (abs)(x);
  4.       int (*p)(int) = (abs);
  5. }
复制代码

论坛徽章:
0
发表于 2010-04-13 23:04 |显示全部楼层
是比较郁闷的

不同编译器上,有些函数被用宏实现了,有些则还是用函数实现

没标准真不好办

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
发表于 2010-04-13 23:08 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
发表于 2010-04-17 14:47 |显示全部楼层
不错 谢谢  OwnWaterloo

论坛徽章:
0
发表于 2010-04-17 17:06 |显示全部楼层
撞车
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP