`
tianshibaijia
  • 浏览: 1128886 次
文章分类
社区版块
存档分类
最新评论

C语言中的名字层次

 
阅读更多

P.J Plauger的"The Standard C Library"一书的Chapter0的章后练习中有这样的一道题:编写一个包含如下一行语句的正确的程序: x: ((struct x*)x)->x=x(5);

并描述这行语句中x的5种截然不同的use,这里其实涉及到这么一个知识或者说概念:C语言的命名空间(namespace),在"C语言参考手册"中还被称作: overloading class。 这 里namespace,并非C++中的那个keyword "namespace",这里的namespace更多是编译器为了识别不同范围下的标识符而进行的划分,而不是提供给应用程序员的类似c++中的那个 namespace facility。再次注意:C的namespace不是一个关键字。

简单分析一下这行语句:x: ((struct x*)x)->x=x(5); 这里有5个x,第一印象:这样的语句能编译过去么?那既然P.J Plauger提出了这样的问题,那么自然有solution。

从左到右顺序:

第一个x -- 毋庸置疑,这是一个标号(label) ;

第二个x -- 这里的x显然是一个struct tag(结构体标志);

第三个x -- 这里的x 无法确定其具体身份,可能是一指针类型,也可能就是一个整型;

第四个x -- x前面有->,显然这个x是某结构体的一个成员变量;

第五个x -- x(5)让人"浮想联翩",第一印象是函数调用,细致一想还可能是一个宏哦(你肯定会说不可能,呵呵,别着急,慢慢来) 到底如何增加一些语法元素能让这一行能顺利通过编译,并执行后得到合理结果呢?

我们不妨先来温习一下C标准中对C的"命名空间"的诠释。 在"C语言参考手册"中有如此说明,标准C将其Namespace分成了五种,分别是:

1) 预处理器宏名

2) 语句标号

3) 结构、枚举、联合结构的标志

4) 成员名

5) 其他名称 包括变量名、函数名、typedef名称和枚举常量

有了以上的说明,我们有了第一种方案:上面说了,语句x: ((struct x*)x)->x=x(5)中有三个x都是可以确定的,不确定的是第三个x和最后一个x。我们先考虑让最后一个x为一个函数。 考虑到最后一个名称空间的说明,一旦最后一个x为函数的话,第三个x就不能为变量名、typedef名称和枚举常量了。如果x是对象宏(不带参数的宏),显然也不合理;那么我们先将x实现为函数看看:

struct x { //for the 2nd x

int x; //for the 4th x };

int x(int a) { //for the 3rd and 5th x

return a; }

int main()

{

x: ((struct x*)x)->x=x(5);

}

这个在gcc(sunos or mingw on windows下)下编译能顺利通过。但是执行一下编译出的程序,会出现致命错误。初略分析一下也不奇怪。函数x的地址是在代码段,那块内存区域是只读且受保护的,尝试强制赋值显然os是不允许的。 第一种方案虽然能通过编译,但是执行结果不合理。

我们来做第二种尝试:试着将最后一个x实现为一个函数宏(带参数的宏)。

struct x { //for the 2nd x

int x; //for the 4th x };

struct x ax;

#define x(a) (a);

int main() {

int x = (int)(&ax);

x: ((struct x*)x)->x=x(5);

printf("%d/n", ((struct x*)x)->x); //output: 5

}

这回,我们得到了正确的且合理的solution了。在P.J Plauger的"The Standard C Library"一书中还有一张关于C语言命名空间的图,记起来更形象。

分享到:
评论

相关推荐

    C语言编程魔法书:基于C11标准.mobi

    阅读建议:本书从基础到高级,全面而深入,不同层次的读者可选择适合自己的章节阅读,参见前言“如何阅读本书”模块。 预备知识篇(第1~3章),为初级读者提供计算机理论知识和相关概念,如编程模式、主流开源...

    《你必须知道的495个C语言问题》

    《你必须知道的495个C语言问题》结构清晰,讲解透彻,是各高校相关专业C语言课程很好的教学参考书,也是各层次C程序员的优秀实践指南。 -----------------------------------------------------------------------...

    你必须知道的495个C语言问题.pdf

     本书结构清晰,讲解透彻,是各高校相关专业C语言课程很好的教学参考书,也是各层次C程序员的优秀实践指南。 作者简介 Steve Summit,著名的C语言专家。Usenet C FAQ的创始人和维护者,有近30年的C编程经验。...

    二级C语言公共基础知识

    (13) 面向对象的程序设计方法中涉及的对象是系统中用来描述客观事物的一个______。 答:实体 (14) 软件的需求分析阶段的工作,可以概括为四个方面:______、需求分析、编写需求规格说明书和需求评审。 答:需求获取...

    计算机二级C语言考试题预测

    (58) 在数据流图(DFD)中,带有名字的箭头表示(C) A. 控制程序的执行顺序 B. 模块之间的调用关系 C. 数据的流向 D. 程序的组成成分 (59) SQL语言又称为(C) A. 结构化定义语言 B. 结构化控制语言 C. 结构化查询语言...

    c++精粹c++精粹c++精粹c++精粹

    这本书不仅仅是一本简明的参考指南或是对一个复杂课题的简单小结,Pohl博士在经过缜密思考...特别是标准模板库(STL)、名字域、运行时类型识别(RTT1)以及BOOL数据类型,这些内容在大多数专业书籍中并没有详细论述。

    概观C++程序设计语言

    描述在面向对象程序设计中使用到的类层次机制;以及用于支持范型程序设计的模板(template)机制; [§5 大规模程序设计]: 描述namespace(名字空间)以及异常处理(exception handling)机制(在将许多独立的...

    《概观C++程序设计语言》

    描述在面向对象程序设计中使用到的类层次机制;以及用于支持范型程序设计的模板(template)机制; [§5 大规模程序设计]: 描述namespace(名字空间)以及异常处理(exception handling)机制(在将许多独立的...

    电子设计初学者如何入门.docx

    我只告诉你这些软件的名字当然是没有用处的,下载了这些软件、买了单片机然后呢?没人教学起来可有的难度啊,很多人都是在这里结束了自己单片机生涯。 我的建议是:淘宝网上搜索"51单片机开发板",然后自行选择一个...

    Tcl_TK编程权威指南pdf

    我一直使自己在很大程度上保持着一个Tcl程序员的角色,而我们工作组中的其他人员则埋头于Tcl本身的C语言实现。我创建的应用程序有HTML编辑器、EMAIL比用户接口程序、Web服务器以及用户数据库,我们的商务应用就建立...

    C标准库.pdf

    《C标准库》结构清晰,内容权威,阐述精辟,对于各层次C程序员和相关专业高校师生都是一本优秀的参考书。 编辑推荐 C标准库“圣经”,提供完整源代码,全面深入阐述库函数的实现与运用。C程序员必备参考书。《C标准...

    C++大学教程,一本适合初学者的入门教材(part2)

    1.7 C语言与C++的历史 1.8 C++标准库 1.9 Java、Internet与万维网 1.10 其他高级语言 1.11 结构化编程 1.12 典型C++环境基础 1.13 C++与本书的一般说明 1.14 C++编程简介 1.15 简单程序:打印一行文本 ...

    C++大学教程,一本适合初学者的入门教材(part1)

    1.7 C语言与C++的历史 1.8 C++标准库 1.9 Java、Internet与万维网 1.10 其他高级语言 1.11 结构化编程 1.12 典型C++环境基础 1.13 C++与本书的一般说明 1.14 C++编程简介 1.15 简单程序:打印一行文本 ...

    ROS机器人操作系统入门 Tutorials CN版 20150726

    message可以包含任意的嵌套结构和数组(很类似于C语言的结构structs) Topics: Messages以一种发布/订阅的方式传递。一个node可以在一个给定的topic中发布消息。Topic是一个name被用于描述消息内容。一个node针对...

    我的编程感悟(中文PDF)(共37M二分卷)分卷二

    7.2.3 SIMD技术在C语言环境下的使用 196 7.2.4 MMX 编码技巧 197 7.2.5 SIMD 的应用举例 201 7.2.6 SIMD编程注意要点 203 7.2.7 SIMD的性能检测 204 第8章 引擎中的优化 205 8.1 Blit的优化 207 8.2 脏矩形优化 209 ...

    我的编程感悟(中文PDF)(共37M二分卷)分卷一

    7.2.3 SIMD技术在C语言环境下的使用 196 7.2.4 MMX 编码技巧 197 7.2.5 SIMD 的应用举例 201 7.2.6 SIMD编程注意要点 203 7.2.7 SIMD的性能检测 204 第8章 引擎中的优化 205 8.1 Blit的优化 207 8.2 脏矩形优化 209 ...

    会计理论考试题

    A、网状 B、层次 C、树形 D、链状 29.显示卡速度对Windows98的系统性能影响的因素有___A____。 A、Windows98的GUI特点 B、背景图案 C、屏幕保护程序 D、画笔 30.下列计算机设备中,属于输入设备的是__D___。 A、...

    C/C++笔试题(附答案,华为面试题系列)

    答:函数和变量被C++编译后在符号库中的名字与C语言的不同,被extern "C"修饰的变 量和函数是按照C语言方式编译和连接的。由于编译后的名字不同,C++程序不能直接调 用C 函数。C++提供了一个C 连接交换指定符号...

    最新名企标准通用C++面试题,

    函数被C++编译后在库中的名字与C语言的不同。假设某个函数的原型为: void foo(int x, int y); 该函数被C编译器编译后在库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字。 C++提供了C连接交换指定...

    JAVA面试题最全集

    给定一个C语言函数,要求实现在java类中进行调用。 45.如何获得数组的长度? 46.访问修饰符“public/private/protected/缺省的修饰符”的使用 47.用关键字final修饰一个类或者方法时,有何意义? 48.掌握类和...

Global site tag (gtag.js) - Google Analytics