概述
目录
1、# 预处理命令
1.1#include 文件包含
1.2#define 宏定义
1.2.1基本用法
1.2.2参数化用法
1.2.2字符串化和宏参数的连接
1.3#用作条件编译
1.3.1 #if的用法
1.3.2 #ifdef的用法
1.3.3 #ifndef的用法
1.4#error
1、# 预处理命令
C语言源文件要经过编译、链接才能生成可执行程序,在编译和链接之前,还需要对源文件进行一些文本方面的操作,比如文本替换、文件包含、删除部分代码等,这个过程叫做预处理,由预处理程序完成。较之其他编程语言,C/C++ 语言更依赖预处理器,所以在阅读或开发 C/C++ 程序过程中,可能会接触大量的预处理指令,比如 #include、#define 等。
1.1#include 文件包含
#include
叫做文件包含命令,用来引入对应的头文件(.h
文件)。#include 也是C语言预处理命令的一种。#include 的处理过程很简单,就是将头文件的内容插入到该命令所在的位置,从而把头文件和当前源文件连接成一个源文件,这与复制粘贴的效果相同。#include 的用法有两种,如下所示:
#include <string.h>
#include "string.h"
使用尖括号< >
和双引号" "
的区别在于头文件的搜索路径不同:
1)使用<>,编译器会到系统路径下查找头文件。
2)使用"",编译器首先在当前目录下查找头文件,没找到,再到系统路径下查
关于 #include 用法的注意事项
1)一个 #include 命令只能包含一个头文件,多个头文件需要多个 #include 命令。
2)同一个头文件可以被多次引入,多次引入的效果和一次引入的效果相同,因为头文件在代码层面有防止重复引入的机制
3)文件包含允许嵌套,也就是说在一个被包含的文件中又可以包含另一个文件。
1.2#define 宏定义
1.2.1基本用法
#define 叫做宏定义命令,它也是C语言预处理命令的一种。所谓宏定义,就是用一个标识符来表示一个内容。宏定义的一般形式为
#define 宏名 内容
内容可以时数字、表达式、if语句、函数等。
关于 #define 用法的注意事项
1、宏定义使用宏名来表示内容,预处理程序对它不做任何检查,如果错误,只能在编译已被宏展开后的源程序时发现。
2、宏定义不是说明或语句,不需要加分号,如果加上分号则连分号也一起替换
3、宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束,如要终止其作用域可使用#undef命令
#define PI 3.14159
int main()
{
// Code
return 0;
}
#undef PI
void func()
{
// Code
}
1.2.2参数化用法
C语言允许宏带有参数。在宏定义中的参数称为“形式参数”,在宏调用中的参数称为“实际参数”,这点和函数有些类似。对带参数的宏,在展开过程中不仅要进行字符串替换,还要用实参去替换形参。
内容中可以包含各个形参。带参数宏调用的形式如下
#define 宏名(形参列表) 内容
宏名(实参列表);
具体使用示例如下。在宏展开时,用实参 5 去代替形参 y,经预处理程序展开后的语句为k=5*5+3*5
。
#define M(y) y*y+3*y //宏定义
k=M(5); //宏调用
注意事项
1、带参宏定义中,形参之间可以出现空格,但是宏名和形参列表之间不能有空格出现。
#define MAX(a,b) (a>b)?a:b
#define MAX (a,b) (a>b)?a:b
2、在带参宏定义中,不会为形式参数分配内存,因此不必指明数据类型。而在宏调用中,实参包含了具体的数据,要用它们去替换形参,因此实参必须要指明数据类型。这一点和函数是不同的:在函数中,形参和实参是两个不同的变量,都有自己的作用域,调用时要把实参的值传递给形参;而在带参数的宏中,只是符号的替换,不存在值传递的问题
3、在宏定义中,字符串内的形参通常要用括号括起来以避免出错。
#include <stdio.h>
#define SQ(y) y*y
int main()
{
int a, sq;
printf("input a number: ");
scanf("%d", &a);
sq = SQ(a+1);
printf("sq=%dn", sq);
return 0;
}
sq = a+1*a+1 = 9+1*9+1 = 19 与预期结果81不同
#include <stdio.h>
#define SQ(y) (y)*(y)
int main()
{
int a,sq;
printf("input a number: ");
scanf("%d", &a);
sq = 200 / SQ(a+1);
printf("sq=%dn", sq);
return 0;
}
sq = 200/(9+1)*(9+1) = 200 与预期结果2不同
#include <stdio.h>
#define SQ(y) ((y)*(y))
int main()
{
int a,sq;
printf("input a number: ");
scanf("%d", &a);
sq = 200 / SQ(a+1);
printf("sq=%dn", sq);
return 0;
}
sq = 200/((9+1)*(9+1)) = 2 正确
1.2.2字符串化和宏参数的连接
#的用法
#用来将红参数转换为字符串,也就是红参数的开头和末尾添加引号,
#define STR(a) #a
printf("%s",STR(c.biancheng.net));
printf("%s",STR("c.biancheng.net"));
输出结果为
c.biancheng.net
"c.biancheng.net"
##的用法
##成为连接符,用来将宏参数和其他的字符串连接起来。
#define DEBUG(a) debug##a
int DEBUG(1)=5;
其实这样就定义了一个int类型的变量debug1=5;
1.3#用作条件编译
1.3.1 #if的用法
#if 表达式1
代码1
#elif 表达式2
代码2
#elif 表达式3
代码3
#else
代码4
#endif
意思是如果表达式1的值为真(非0),就对代码1进行编译,否则表达式2,依次执行。需要注意的是表达式判断的条件是整型常量表达式,也就是说表达式中不能包含变量,而且结果必须是整数。切必须配合#endif进行使用。
1.3.2 #ifdef的用法
#ifdef 宏名
程序段1
#else
程序段2
#endif
意识为党宏被定义过,则对程序段1进行编译,否则对程序段2进行编译。
1.3.3 #ifndef的用法
与1.3.2中#ifdef的用法相反,表示宏定义未被定义执行代码1。
1.4#error
#error指令用来在编译期间产生错误信息,并阻止程序的编译,其形式如下
#error error_message
#ifdef WIN32
#error This programe cannot compile at Windows Platform
#endif
最后
以上就是忧心胡萝卜为你收集整理的C语言#的用法1、# 预处理命令的全部内容,希望文章能够帮你解决C语言#的用法1、# 预处理命令所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复