预处理有哪些呢
文件包含 条件编译 宏定义
什么时候使用预编译
- 总是使用不经常改动的大型代码体
- 程序由多个模块组成,所有模块都使用一组标准的包含头文件和相同的编译选项,这样可以将所包含文件编译为一个预编译头
宏定义
#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 ... ... // 声明、定义语句