- #开头,编译预处理指令。 不是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
不推荐的
定义原则:
- 整个宏的值都有括号
- 每个参数都有括号
#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类型,然后通过了编译,但运行时就会出现错误。