C++预处理

预处理有哪些呢

        文件包含  条件编译  宏定义

什么时候使用预编译

  • 总是使用不经常改动的大型代码体  
  • 程序由多个模块组成,所有模块都使用一组标准的包含头文件和相同的编译选项,这样可以将所包含文件编译为一个预编译头

宏定义

 #define 宏名(参数表) 字符串

宏名 参数表之间没有空格

#define swap(x, y) (x)=(x) + (y); (y) = (x) - (y); (x) = (x) -(y);
#define PI 3.14  
#define  Min(X, Y)  ((X)>(Y)?(Y):(X))

       涉及宏的地方,不使用++ --  如果使用,结果依赖于编译器 

  • 宏定义末尾不加分号,可以用#undef命令终止宏定义的作用域。
  • 宏定义不分配内存,变量定义才分配,宏定义参数是无类型的。

宏定义和const区别?

  • 宏替换发生在编译阶段之前,属于文本插入替换;const作用发生于编译过程中。
  • 宏不检查类型;const会检查数据类型。
  • 宏定义的数据没有分配内存空间,只是插入替换掉;const定义的变量只是值不能改变,但要分配内存空间。

宏定义和内联函数(inline)区别?

  • 在使用时,宏只做简单字符串替换(编译前)。而内联函数可以进行参数类型检查(编译时),且具有返回值。
  • 内联函数本身是函数,强调函数特性,具有重载等功能。
  • 内联函数可以作为某个类的成员函数,这样可以使用类的保护成员和私有成员。而当一个表达式涉及到类保护成员或私有成员时,宏就不能实现了。
  •  对于一个频繁使用的短小函数,C语言中应用什么实现,C++中应用什么实现呢

           C 用宏定义,C++用inline

带参宏和带参函数的区别

  •         带参宏在编译期间处理,不占用运行时间(直接替换),不占内存,参数无类型,程序长度是变长的,宏函数不要在最后加分号。
  •         带参函数在运行时处理的,调用和返回时占用运行时间,占存储空间,参数有类型,定长,

typedef和define的区别

https://blog.csdn.net/summer00072/article/details/80918483

不同点

typedef

define

原理

typedef是关键字,在编译时处理,有类型检查功能。它在自己的作用域内给一个已经存在的类型一个别名,但不能在一个函数定义里面使用typedef。typedef是语句,需要加分号

#define是C语言中定义的语法,是预处理指令,发生在编译之前。在预处理时进行简单而机械的字符串替换,不作正确性检查,只有在编译已被展开的源程序时才会发现可能的错误并报错。define末尾不加分号

功能

typedef用来定义类型的别名,起到类型易于记忆的功能。另一个功能是定义机器无关的类型。

如定义一个REAL的浮点类型,在目标机器上它可以获得最高的精度:typedef long double REAL, 在不支持long double的机器上,看起来是这样的,typedef double REAL,在不支持double的机器上,是这样的,typedef float REAL

#define不只是可以为类型取别名,还可以定义常量、变量、编译开关等。

作用域

typedef有自己的作用域。

#define没有作用域的限制,只要是之前预定义过的宏,在以后的程序中都可以使用

对指针的操作

typedef int* INTPTR2;

INTPTR2 p3, p4;

声明两个指针变量p3、p4

typedef int* INTPTR2;

int b = 2;

const INTPTR2 p2 = &b;

const INTPTR2 p2是一个指针常量,不可使p2再指向其他内容。因为INTPTR2表示一个指针类型,因此用const限定,表示封锁了这个指针类型。

#define INTPTR1 int*

INTPTR1 p1, p2;

声明一个指针变量p1和一个整型变量p2

#define INTPTR1 int*

int a = 1;

const INTPTR1 p1 = &a;

const INTPTR1 p1是一个常量指针,即不可以通过p1去修改p1指向的内容,但是p1可以指向其他内容。

条件编译

 VC 中哪些方法避免C编程中的头文件重复包含:

#ifndef h_filename 
#define h_filename ······ // 声明、定义语句 #endif 

条件编译#ifndef, #else, #endif作用?

  • 可以通过加#define,并通过#ifndef来判断,将某些具体模块包括进要编译的内容。
  • 用于子程序前加#define DEBUG用于程序调试。
  • 应对硬件的设置(机器类型等)。
  • 条件编译功能if也可实现,但条件编译可以减少被编译语句,从而减少目标程序大小。

#pragma once

  • #pragma once这个宏有什么作用?

    • 为了避免同一个头文件被包含(include)多次,C/C++中有两种宏实现方式:

      • 一种是#ifndef方式;另一种是#pragma once方式。

  • #pragma once使用方式?

#pragmaonce  ... ... // 声明、定义语句

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值