c语言宏学习笔记
宏 头文件
全局变量:定义在函数外面的变量。全局变量具有全局的生存期和作用域,他们与任何的函数都无关,在任何函数内部都可以使用他们
全局变量初始化
没有做初始化的全局变量会得到0值,指针会得到NULL值,只能用编译时刻已知的值来初始化全局变量,他们的初始化发生在main函数之前
被隐藏的全局变量
如果函数内部存在与全局变量同名的变量,则全局变量被隐藏
没有值的宏#define_DEBUG,这类宏是用于条件编译的,后面有其他的编译预处理指令来检查这个宏是否已经被定义过了
宏 像函数的宏 #define cube(x) ((x)*(x) * (x))宏可以带参数
多个.c文件
main()里的代码太长了适合分成几个函数,一个源代码文件太长了适合分成几个文件,两个独立的源代码文件不能编译形成可执行的程序
项目
·在DevC++中新建一个项目,然后把几个源代码文件加入进去
·对于项目,Dev C++的编译会把一个项目中所有的源代码文件都编译后,链接起来
·有的IDE有分开的编译和构建两个按钮,前者是对单个源代码文件编译,后者是对整个项目做链接
头文件
·把函数原型放到一个头文件(以.h结尾)中,在需要调用这个函数的源代码文件(.c文件)中#include这个头文件,就能让编译器在编译的时候知道函数的原型
·在使用和定义这个函数的地方都应该#include这个头文件
·一般的做法就是任何.c都有对应的同名的.h,把所有对外公开的函数的原型和全局变量的声明都放进去
#include
·#include是一个编译预处理指令,和宏一样,在编译之前就处理了
·它把那个文件的全部文本内容原封不动地插入到它所在的地方
·所以也不是一定要在.c文件的最前面#include
include的误区
·#include不是用来引入库的
·stdio.h里只有printf的原型,printf的代码在另外的地方,某个.lib(Windows)或.a(Unix)中
·现在的C语言编译器默认会引入所有的标准库
·#include <stdio.h>只是为了让编译器知道printf函数的原型,保证你调用时给出的参数值是正确的类型
“”还是<>
·#include有两种形式来指出要插入的文件
·“”要求编译器首先在当前目录(.c文件所在的目录)寻找这个文件,如果没有,到编译器指定的目录去找
·<>让编译器只在指定的目录去找
·编译器自己知道自己的标准库的头文件在哪里
·环境变量和编译器命令行参数也可以指定寻找头文件的目录
不对外公开的函数
·在函数前面加上static就使得它成为只能在所在的编译单元中被使用的函数
·在全局变量前面加上static就使得它成为只能在所在的编译单元中被使用的全局变量
变量的声明
·inti;是变量的定义
·extern int i;是变量的声明
声明和定义
·声明是不产生代码的东西·函数原型·变量声明·结构声明·宏声明·枚举声明·类型声明·inline函数
·定义是产生代码的东西
重复声明
·同一个编译单元里,同名的结构不能被重复声明
·如果你的头文件里有结构的声明,很难这个头文件不会在一个编译单元里被#include多次·所以需要“标准头文件结构”
宏可以带参数
带参数的宏的原则
·一切都要括号·整个值要括号
·参数出现的每个地方都要括号
·#define RADTODEG(x) ((x) * 57.29578)
带参数的宏
·在大型程序的代码中使用非常普遍·可以非常复杂,如“产生”函数
·在#和##这两个运算符的帮助下·存在中西方文化差异
·部分宏会被inline函数替代

浙公网安备 33010602011771号