预编译处理

.c文件生成.exe文件

msdn

#define

宏与函数进行对比

宏相对与函数的优点

1,用于调用函数和从函数返回的代码可能比实际执行这个小型计算工作所需要的时间更多。所以宏比函数在程序的规模和速度方面更胜一筹。
2.更为重要的是函数的参数必须声明为特定的类型。所以函数只能在类型合适的表达式上使用。反之这个宏怎可以适用于整形、长整型、浮点型等可以用来比较的类型。宏是类型无关的。

宏相对于函数的缺点

1.每次使用宏的时候,一份宏定义的代码将插入到程序中。除非宏比较短,否则可能大幅度增加程序的长度
2宏是没法调试的
3.宏由于类型无关,也就不够严谨。
4宏可能会带来运算符优先级的问题,导致程容易出现错
宏有时候可以做函数做不到的事情。比如:宏的参数可以出现类型,但是函数做不到。

#define MALLOC(num,type)  (type*)malloc(num *sizeof(type))

注意

1.宏参数和#define定义中可以出现其他#define定义的变量。但是对于宏,不能出现递归
2.当预处理器搜索#define定义的符号的时候,字符串常量的内容并不被搜索

#include

在文件中使用#include包含其他已经存在的文件,这可以说是文件之间建立联系,本质上其实是将被包含的文件添加到当前文件。
一般就两种包含方式#include<>和#include""
1.#include<>,这种方式优先从系统文件中寻找被包含文件,一般用于库函数文件的调用
2.#include"",这种方式优先从当前文件夹中寻找被包含文件,一般用于自己写的文件调用
不同的场景运用不同的放式,可以节省时间
#pragma once
这个宏定义是防止相同的文件在一个文件中被多次包含
正确地运用文件包含可以避免浪费时间、资源。

注意

1.文件包含可以嵌套,但是不能循环嵌套
2.被包含文件中的全局变量,也是包含文件中的全局变量,无需再extern声明。

条件编译

大抵是有以下几种方式
1.单分支
#if 常量表达式
//…
#endif
常量表达式由预处理器求值。
如:
#define _DEBUG1
#if _DEBUG
//…
#endif
2.多个分支的条件编译
#if 常量表达式
//…
#elif 常量表达式
//…
#else
//…
#endif
3.判断是否被定义
#if defined(symbo1)
#ifdef symbol
#if !defined(symbol)
#ifndef symbol
4.套指令
#if defined(OS_UNIX)
#ifdef OPTION1
unix_version_option1();
#endif
#ifdef OPTION2
unix_version_option2();
#endif
#elif defined(OS_MSDOS)
#ifdefOPTION2
msdos_version_option2();
#endif
#endif

#和##

1.``一个技巧是:使用#,把一个宏参数变成对应的字符串。

#define PRINT(a)  printf("the value of "#a" is %d",a)
void print(int a)
{
	printf("the value of a is %d", a);
}
int main()
{
	int b = 10;
	PRINT(b);
	print(b);
	return 0;
}

msdn
显然在这里用函数不能达到我们想要的结果,这个宏却很好的解决了

2.##的使用
##是作为分隔符存在字符串与字符串之间,使用时它是先分隔再强制连接

宏和函数各有千秋,优点有可能也是缺点,不足的地方有时候却能给人带来便利。宏与类别没有关系,传参却可以方便地传一个类型,但是也因此造成了不太严谨的结果。函数对类型有严格的定义,对不同类型的数据却有点麻烦,也不能传一个类型。内联函数很好得解决了二者间的矛盾,兼顾了优点,但这更新迭代的过程也很有意思。可能没有什么完美,也可能完美只是从另一个角度看。

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值