C语言#的用法

目录

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=%d\n", 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=%d\n", 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=%d\n", 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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值