编译预处理

  • #开头,编译预处理指令。    不是C的语言
  • #define 定义一个宏

1,宏的定义

#define 宏名  宏的值         //值可以是任意的

#include <stdio.h>
#define P printf("你好\n")
#define wenzi "哈哈哈\n"
#define num 5
int main(){
	P;
	printf(wenzi);
	printf("%d",num+2);
	return 0;
}

输出:
你好
哈哈哈
7

 2,宏的特点

  • 注释不会被当作宏的一部分
  • 宏的定义可以嵌套
  • \  若一个宏的值超过一行。该行未结束,与下一行连成一个整体
#include <stdio.h>
#define P "你好\
大家好\n"
#define num 5
#define num_1 num+5    //嵌套定义 
int main(){
	printf(P);
	printf("%d\n",num);
	printf("%d",num_1);
	return 0;
}

输出:

你好大家好
5
10

定义没有值的宏

#define num      用于条件编译

预定义的宏

例如:·_LINE_·    

3,带参数的宏

#define num(x) ((x)*(x)*(x))

#define min(a,b) (a>b?b:a)

#define  cbb (x*123)

#define (x)*123

不推荐的

定义原则:

  1. 整个宏的值都有括号
  2. 每个参数都有括号 
#include <stdio.h>
#define min(a,b) (a>b?b:a)
#define num(x) ((x)*(x)*(x))
int main(){
	printf("min=%d\n",min(7,4));
	printf("%d",num(5));
	return 0;
}

min=4
125

4,#include

把函数原型放到一个头文件(以.h结尾)中,在需要调用这个函数的源代码文件(.c文件)中#include这个头文件,就能让编译器在编译的时候知道函数的原型.

(1)#include 作用

  • 把函数原型放到一个头文件(以.h结尾)中,在需要调用这个函数的源代码文件(.c文件)中#include这个头文件,就能让编译器在编译的时候知道函数的原型
  • 它把那个文件的全部文本内容原封不动地插入到它所在的地方
  • ·所以也不是一定要在.c文件的最前面#include

(2)两种include方法区别

  • #include有两种形式来指出要插入的文件
  • “ ”要求编译器首先在当前目录(.c文件所在的目录)寻找这个文件,如果没有,到编译器指定的目录六找
  • <>让编译器只在指定的目录去找

使用 " "  使自己定义的头文件

<>是系统给的头文件

#incldue <stdio.h>
#include "max.h"

(3)头文件使用

  • 在使用和定义这个函数的地方都应该#include这个头文件
  • 一般的做法就是任何.c(源代码文件,main()函数除外)都有对应的同名的.h(头文件),把所有对外公开的函数的原型和全局变量的声明都放进去

(4)不对外公开

  • 在函数前面加上static就使得它成为只能在所在的编译单元中被使用的函数
  • 在全局变量前面加上static就使得它成为只能在所在的编译单元中被使用的全局变量

(5)#include误区

  • #include 不是用来引入库的

  • stdio.h 头文件中,只有printf()函数原型,用来保证参数正确输入

5,声明

int i;   定义变量

extern int i;  声明变量

int max(int a,int b);  声明函数

声明不是产生代码的东西,定义才是

声明只是告诉你一下,让你知道

只有声明可以被放入头文件中

(1)重复声明

  • 同一个编译单元里,同名的结构不能被重复声明如果你的头文件里有结构的声明,很难这个头文件不会在一个编译单元里被#include多次
  •  所以需要“标准头文件结构”

(2)标准头文件结构

运用条件编译和宏,保证这个头文件在一个编译单元中只会被#include一次

 如果 _LIST_HEAD_  没有被定义,则定义它。若定义了,就不管

以下有关宏替换的叙述不正确的是(D )。A. 宏替换不占用运行时间。 B. 宏名无类型。 C. 宏替换只是字符替换。 D. 宏名必须用大写字母表示。

A.占用编译时间,不占用程序运行时间

D.建议宏名用大写字母表示

以下正确的叙述是( D)。

A.宏定义不能出现在函数内部

B.在程序的一行中可以出现多个有效的预处理命令行

C.使用带参数宏定义时,参数的类型应与宏定义时一致

D.宏替换不占用运行时间,只占用编译时间

B.不可以

C.宏没有参数

在一个C源程序文件中,若要定义一个只允许本源文件中所有函数使用的全局变量,则该变量需要使用的存储类别是(D

A.extern

B.register

C.auto

D.static

本源文件指的是  .c文件       一个程序中会有多个.c文件。本源文件单指一个.c文件

凡是函数中未指定存储类别的局部变量,其隐含的存储类型为(B )。

A.静态(static)

B.自动(auto)

C.外部(extern)

D.寄存器(register)

忘了在程序开头写#include <stdio.h>,但是main()中的printf("hello\n");还是通过了编译而且运行正确。说明为什么会这样,并举出例子说明什么情况下不#include相应的头文件会通过编译但是不能正确运行?

即使没有include这个头文件,编译器仍然把它链接进去了。

比如一个函数的原型中,变量与返回值都是double类型,但是却没有include相应的头文件,此时编译器会默认变量与返回值的类型都是int类型,然后通过了编译,但运行时就会出现错误。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值