欢迎来到天天文库
浏览记录
ID:56282281
大小:169.00 KB
页数:37页
时间:2020-06-05
《计算机类基础问题——经典题目合集.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、C C语言考查的重点一般是:指针、结构体、条件编译、全局变量/局部变量。以下是我遇见过的面试问题:1)请说一下externC的作用(汉略)Extern“C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren“c”后,C++就能直接调用C函数了。Extern“C”主要使用正规DLL函数的引用和导出和在C++包含C函数或C头文件时使用。使用时在前面加上extern“c”关键字即可extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关
2、键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。记住,下列语句: extern int a; 仅仅是一个变量的声明,其并不是在定义变量a,并未为a分配内存空间。变量a在所有模块中作为一种全局变量只能被定义一次,否则会出现连接错误。 通常,在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。例如,如果模块B欲引用该模块A中定义的全局变量和函数时只需包含模块A的头文件即可。这样,模块B中调用模块A中的函数时,在编译阶段,模块B虽然找不到该函数,但是并不会报错;它会在连接阶段中从模块A编译生成的目标代码中找到此函数。(一、修饰名(D
3、ecoratedName) C/C++程序中的函数在内部是通过修饰名来标识的。修饰名是在函数定义或原型编译阶段由编译器创建字符串。当你在LINK等工具中要指定一个函数名时,会用到修饰名。 1、使用修饰名: 大多数情况下,你不必知道函数的修饰名是什么。连接器等工具通常都能处理函数未修饰的名字。然而,在有些情况下,你可能需要指定函数的修饰名。对于C++重载函数和特定的成员函数(如:构造函数和析构函数),你必须指定这些函数的修饰名,以便连接器等工具能够匹配名字。同时,你也必须在那些引用c或c++函数名的汇编源文件中使用修饰名。 2、查看修饰名: 如果你编译了一个源文件,该源文
4、件中包含了函数定义或原型,你可以获得函数的修饰名形式。 (1)用编译器列表(compilerlisting)来查看: (i)通过将列表文件类型编译器选项(/FA[c
5、s])设置为下面中的一种,来产生列表文件:AssemblywithMachineCode(/FAc);AssemblywithSourceCode(/FAs);Assembly,MachineCode,andSource(/FAcs). (ii)在产生的列表文件中,找到包含未经修饰的函数定义的行。 (iii)查找前面一行。PROCNEAR命令标签前就是函数名经过修饰后的形式。 (2)使用DUMPBIN工具来
6、查看: 在.OBJ或.LIB上运行DUMPBIN,使用/SYMBOLS选项。在输出中查找未经修饰的函数定义。后面跟着的就是经过修饰的函数名,用圆括号括起来的。 二、替代连接说明: 如果在c++中编写一个程序需要用到c的库,那该如何?如果这样声明一个c函数: voidf(inta,charb); c++编译器就会将这个名字变成相应的修饰名,比如:?f@@YAXHD@Z。 然而,c编译器编译的库的内部函数名(连接器使用)是完全不同的。这样,当c++连接器连接c的函数库时,将会产生内部使用函数不匹配。 故,c++中提供了一个替代连接说明(alternatelinkages
7、pecification),它是通过重载extern关键字来实现的。 extern后跟一个字符串来指定想声明的函数的连接类型,后面是函数声明,比如: extern"C"voidf(inta,charb); 这样,就是告诉编译器是c连接,这样就不会转换函数名了。此例中,编译后的内部函数名是_f。2)请说一下#ifdef...的作用(汉略)#ifdef的作用大体上是工程功能的切换,通常是根据某些宏是否定义来决定是否启用某些功能。比如网络监控系统,通过宏的切换,可以实现平台的移植,视屏路数的定义,云台、矩阵和透明串口的切换,等等。由于#ifdef的存在,静态配置一下参数即可让fi
8、rmware实现不同的功能。1.利用#ifdef/#endif将某程序功能模块包括进去,以向某用户提供该功能。 在程序首部定义#ifdefHNLD: #ifdefHNLD include"n166_hn.c" #endif 如果不许向别的用户提供该功能,则在编译之前将首部的HNLD加一下划线即可。 2.在每一个子程序前加上标记,以便追踪程序的运行。 #ifdefDEBUG printf("Nowisinhunan!"); #endif 3.避开硬件的限制。有时
此文档下载收益归作者所有