免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4512 | 回复: 13
打印 上一主题 下一主题

关于库函数预定义宏的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-07-02 11:17 |只看该作者 |倒序浏览
具个例子,比如我事先不知道libc库里是否实现了function这个函数,而我的程序里需要用到这个函数提供的功能,于是我可以自己写一个具体相同功能相同名字的函数,但是我需要判断libc库里是否有这个函数,如果没有才用我自己写的这个版本,这时候应该用#ifndef这样的预处理来判断吧,可是我怎么知道这个预定义宏的名字呢,它们都是在哪里定义的?是不是有什么惯例呀?如果有是不是所有的库都遵循呢,谢谢

论坛徽章:
0
2 [报告]
发表于 2007-07-02 12:14 |只看该作者
或者根据不同的平台,自己写头文件来定义这些宏?

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
3 [报告]
发表于 2007-07-02 12:19 |只看该作者
原帖由 wawxdyy 于 2007-7-2 11:17 发表于 1楼  
具个例子,比如我事先不知道libc库里是否实现了function这个函数,而我的程序里需要用到这个函数提供的功能,于是我可以自己写一个具体相同功能相同名字的函数,但是我需要判断libc库里是否有这个函数,如果没有 ...

这个要查文档。

论坛徽章:
0
4 [报告]
发表于 2007-07-02 13:38 |只看该作者
原帖由 MMMIX 于 2007-7-2 12:19 发表于 3楼  

这个要查文档。


请举个简单的例子好吗,我不清楚怎么查,谢谢

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
5 [报告]
发表于 2007-07-02 14:23 |只看该作者
原帖由 wawxdyy 于 2007-7-2 13:38 发表于 4楼  


请举个简单的例子好吗,我不清楚怎么查,谢谢

这个要看你用什么 C 库,哪种操作系统,以及其他的一些约束条件。所以,多花的时间精力把你的问题描述清楚吧。

论坛徽章:
0
6 [报告]
发表于 2007-07-02 17:06 |只看该作者
就是在事先不确定操作系统的情况下,比如标准C库,在有的系统里stdlib.h头文件里posix_openpt这个函数,而有的则没有,所以我就得自己写一个,名字也叫做posix_openpt,当标准C库里定义了posix_openpt时,就用标准C库里的,否则就用我写的这个,为了实现这种技术,应该用预处理来判断吧,比如这样:

  1. #ifndef _HAS_OPENPT
  2. int
  3. posix_openpt(int oflag)
  4. {
  5.         ......
  6. }
  7. #endif
复制代码

我想知道这里的_HAS_OPENPT是不是得在自己头文件定义,比如我发现我的stdlib.h里有posix_openpt这个函数的声明,于是就可以在头文件里用#define _HAS_OPENPT 1来预定义

论坛徽章:
0
7 [报告]
发表于 2007-07-02 17:13 |只看该作者
一个函数有没有在头文件里声明,是很难直接判断的。有些已经在系统的头文件里和宏绑定了。比如这样:

  1. #ifndef FUNC_A
  2. int func_a();
  3. #endif
复制代码

实际上大多数并没有这么做。唯一的方法,就是收集和调查不同的操作系统的头文件的差别,然后根据当前的操作系统来决定是不是要自己定义某一个函数

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
8 [报告]
发表于 2007-07-02 17:37 |只看该作者
原帖由 wawxdyy 于 2007-7-2 17:06 发表于 6楼  
就是在事先不确定操作系统的情况下,比如标准C库,在有的系统里stdlib.h头文件里posix_openpt这个函数,而有的则没有,所以我就得自己写一个,名字也叫做posix_openpt,当标准C库里定义了posix_openpt时,就用 ...

总有个大范围吧(你的程序总不会连那些你听都没听过的操作系统也要支持)?例如说支持 POSIX,具有 C 标准库,等等。在这些标准中,尤其是 POSIX,对一些接口方面存在的差异都有相应的判断宏,直接根据你感兴趣的部分查找对应的文档即可。如果使用了特定于某个操作系统的接口,这种情况下也许有标准的测试宏,也许没有,这个也要查文档。

[ 本帖最后由 MMMIX 于 2007-7-2 17:41 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2007-07-02 19:33 |只看该作者
是的,系统的范围就是支持POSIX的系统,posix_openpt这个函数不是所有系统都有的,我的系统上有,可是我找了找了半天也没找到它的测试宏,所以才会想到是不是需要在自己的头文件中定义测试宏

论坛徽章:
0
10 [报告]
发表于 2007-07-02 19:36 |只看该作者
原帖由 sakulagi 于 2007-7-2 17:13 发表于 7楼  
一个函数有没有在头文件里声明,是很难直接判断的。有些已经在系统的头文件里和宏绑定了。比如这样:

#ifndef FUNC_A
int func_a();
#endif

实际上大多数并没有这么做。唯一的方法,就是收集和调查不同 ...


可是这样不利于可移植性啊?另外就说你举的例子,现在我想使用func_a,可是我怎么知道FUNC_A这个测试宏有没有定义呢?

恩,明白了,一般这种宏会在系统头文件里定义的

[ 本帖最后由 wawxdyy 于 2007-7-3 05:44 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP