Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1073713
  • 博文数量: 77
  • 博客积分: 11498
  • 博客等级: 上将
  • 技术积分: 1840
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-04 11:10
文章分类

全部博文(77)

文章存档

2011年(1)

2010年(16)

2009年(5)

2008年(55)

分类: C/C++

2008-08-31 00:29:07


    使用还是?谈谈C++中使用C库名字的问题
    作者:tyc611.cublog.cn,2008-08-31

    C++语言标准建议我们在包含C库头文件时应该采用这种形式,而不要采用这种形式。这种形式只是为了兼容C++标准发布之前的代码,在新的代码中应该采用标准形式

   让我们先来看看现行C++标准(C++2003/C++98)的相关规定(条款17.4.1.2和D.5):


(1)包含头文件时,所有C名字都位于名字空间std中(C宏名除外);
(2)包含头文件时,所有C名字都位于名字空间std中(等效于),并且使用using声明将所有名字导入到全局名字空间中。
  
从上面的标准可以知道,无论使用哪种形式的头文件,都可以在名字空间std中找到相应的名字(宏名除外)。然而,在标准已发布十年的今天,很多编译器并不能完全支持此标准。问题出在第二条规定,它要求形式的头文件也必须在名字空间std中提供所有C名字。也就是说,需要修改以前的C库头文件(在名字空间std中定义C名字)。而这对于使用第三方C库的C++编译器提供商有所困难,并可能不可实现。于是,我们面对的实现情况是,使用可以保证所有C名字(宏名除外)出现在名字空间std中(有可能同时出现在全局名字空间);使用可以保证所有C名字都出现在全局名字空间中,但不一定出现在名字空间std中!

    C++0x不得不面对实现,又对标准进行了修改:

(1)包含头文件时,所有C名字都位于名字空间std中(C宏名除外),有可能也会现实在全局名字空间中;
(2)包含头文件时,所有C名字都位于全局空名字间中,有可能也会出现中名字空间std中

注意前后两次规定中红色部分的变化。

    因此,我们在使用C库时:如果使用形式,则需要在名字空间std中查找C名字(宏名除外);如果使用形式,则需要在全局名字空间中查找C名字。当然,建议使用前者。但需要特别注意的是,C中的宏名(我在前面内容中已用红色字体多次强调了)并不会出现在std中。C中的这类宏名有assert, errno, offsetof, setjmp, va_arg, va_end, and va_start等。

    但C语言又规定了(当然,C++也继承了)这些宏名可以被编译器实现为函数。此时,不得不产生一点疑问:由于宏名并不会出现在名字空间std中,而C中函数名却可能位于名字空间std中,那么一旦C宏被实现为函数,我们到哪去找它?标准对此解释得并不清楚,一方面我们可以理解为C宏都位于全局名字空间中(不论是否实现为函数),另一方面我们可以理解为实现为函数后就遵守函数名的规定。但我认为标准应该是前一个意思,且我用过的编译器都支持前一种解释(如流行的VC、GCC)。

参考资料:
1.
2.


阅读(1721) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~