预处理和结构体的问题

来源:互联网 发布:ubuntu卸载不了软件 编辑:程序博客网 时间:2024/06/06 19:21

1. 文件包含中重复包含,编译是否会显示出错?

 当重复包含头文件,有可能会出现重复定义变量,编译器在进行编译的时候对于重复定义的变量不知道调用哪一个。比如定义了int a=0;又重复定义了int a=1;如果使用这个a,编译器就不知道使用的a等于0还是1,所以编译器不允许出现重复定义,也就不允许重复包含头文件。上面的问题无法通过边缘,容易解决。如果写法不好,造成不被编译发现的问题才是头大,例如:在头文件中定义了全局静态变量,编译后实际在每个引用此头文件的obj中都会有一份,逻辑就混乱了。

 

2. 预处理有哪些类型?

C语言提供多种预处理功能,主要处理#开始的预编译指令,如宏定义(# define),文件包含(# include),条件编译(# ifdef)

 

3.  条件语句和条件编译的区别在哪?

条件编译是C语言中预处理部分的内容,它是编译器编代码时最先处理的部分,。条件编译里面有判断语句,如#if,#else,#endif。它的意思是如果宏条件如果符合,就编译这段代码,否则,编译器就忽略这段代码而不编译。

if语句则不然,ifC语言中的关键字,它根据表达式的计算结果来决定执行哪个语句,它里面的每个分支都编译过了的。

简单点讲,条件编译是根据宏条件选择性编译语句,它是编译器在编译代码时完成的;

条件语句是根据条件表达式选择性地执行语句,它是在程序运行时执行的。

 

4. ##连接的token到底是什么?

 预处理运算符##为宏扩展提供了一种连接实际变元的手段如果替换文本中的参数用##相连,那么参数就被实际变元替换,##与前后的空白符被删除,并对替换后的结果重新扫描。

例如:#define paste(front,pack) frong##pack

从而宏调用paste(name,1)的结果是建立单词name1

  

5. 结构体的有效对齐和自身对齐该如何理解?

结构体的自身对齐值:其成员中自身对齐值最大的那个值;

结构体有效对齐值:自身对齐值和指定对齐值中小的那个值

           

6. 宏定义和typedef的使用有什么区别要注意?

       执行时间不同:typedef在编译阶段有效,由于在编译阶段,typedef有类型检查的功能,#define发生在预处理阶段,只进行监督的字符串替换,不会进行任何检查

功能有差异:typedef用来定义类型的别名,定义与平台无关的数据类型,与struct的结合使用等;#define不只是可以为类型取别名,还可以定义常量,变量,编译开关等作用域不同:#define没有作用域的限制,只要是之前预定义过的宏,在此后的程序中都可以使用,而typedef有自己的作用域

二者修饰指针类型时,作用不同     

 

7.  位段为什么不能进行取地址操作?

     不可以取位段地址。因为在这种情况下,显然没有称作为“位段指针”类型的变量

 

8. 位段存储单元是怎么定义的?   

一个位段必须存储在同一存储单元中,不能跨两个单元。如果第一个单元空间不能容纳下一个位段,则该空间不用,而从下一个单元起存放该位段   

    

9. 类(对象)是什么?  

   类和对象是两种以计算机为载体的计算机语言的合称。对象是对客观事物的抽象,类是对对象的抽象。类是一种抽象的数据类型。它们的关系是:对象是类的实例,类是对象的模板。对象是通过new classname产生的,用来调用类的方法,

      

10. 条件编译能否使用嵌套?

条件编译语句块与函数定义体之间不存在相互嵌套时,所含的#include,#define语句块甚至是被嵌套下级条件编译语句块,按照语句块嵌套的排版方式进行缩进排版

 

      

 

原创粉丝点击