编译预处理(C语言笔记)

预处理行都以#开头,可以出现在程序中的任何位置;
C语言提供的预处理功能有三种:宏定义,文件包含和条件编译

一、 宏定义

1. 不带参数的宏定义

#define 宏名 宏体

注意:
a) 不能在一行上写多条预处理命令;
b) 宏参数无类型;
c) 宏的名称中不能有空格,有分号会连分号一起替换;
d) #define的有效范围:从定义处开始到包含它的源文件结束;
e) 可以用#undef命令提前结束宏定义的作用域

eg:#define PI 3.1415926
int main()
{ 
  }
#undef PI
viod f1()
{
}

f) 在进行宏定义时可以引用已定义的宏名,进行层层代换
g) 对程序中用双引号引起来的字符串内的字符,即使与宏名相同,也不进行替换

2. 带参数的宏定义

#define 宏名(参数表) 宏体

参数表中可以有一个或多个参数,多个参数用逗号分隔

注意:
a) 带参数的宏定义的字符串应该写在一行上,如需写在多行,应使用续行符(\);
b) 注意加圆括号

宏代换是在编译前进行的,在代换时并不分配内存单元,不进行值的传递,也没有返回值的概念;
宏代换不占运行时间,只占编译时间,而函数调用则占运行时间。

二、 文件包含

让编译预处理器把另一个源文件嵌入(包含)到当前源文件中的该指定处
文件包含命令格式如下:

#include<文件名>

#include”文件名“

使用尖括号< >和双引号" "的区别在于头文件的搜索路径不同:
• 使用尖括号< >,编译器会到系统路径下查找头文件;
• 而使用双引号" ",编译器首先在当前目录下查找头文件,如果没有找到,再到系统路径下查找。

也就是说,使用双引号比使用尖括号多了一个查找路径,它的功能更为强大。

注:
1.“#include”的处理过程很简单,就是将头文件的内容插入到该命令所在的位置,从而把头文件和当前源文件连接成一个源文件,这与复制粘贴的效果相同。
2.不管是标准头文件,还是自定义头文件,都只能包含变量和函数的声明,不能包含定义,否则在多次引入时会引起重复定义错误。
3.一条文件包含命令只能包含一个文件。
4.文件包含命令可以嵌套使用。

三、条件编译

1.几种形式

• 形式1
#ifdef  标识符
         程序段1                
	[#else       程序段2]         //可以没有
       #endif

当标识符已被定义过
(一般是用#define定义),
则编译程序段1

• 形式2
#ifndef  标识符(未定义)
  程序段1
[#else    程序段2]          //可以没有
#endif
//意义与形式1相反
• 形式3
#if 表达式  /*或#if(表达式)*/
  程序段1
[#else
  程序段2]
#endif

例题:

在这里插入图片描述

#include <stdio.h>  
#define LETTER 0
int main( )
{	
	char str[30]="C Programming Language ",c;
	int i=0;
	while ((c=str[i])!='\0')
	{
		i++;
#if  LETTER
			if (c>='a'&& c<='z')
				c=c-32;
#else
			if (c>='A'&&c<='Z')
				c=c+32;
#endif
			printf("%c", c);
		}
		printf("\n");
		return 0;
}//修改LETTER的值来改变大小写输出
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值