宏
编译预处理指令
#开头的是预编译处理指令,它们不是c语言指令,但c语言程序离不开它们
#define来定义一个宏
如果一个宏的值中有其他宏的名字,是会被替换的
如果一个宏的值超过一行,最后一行的末尾需要加\
没有值的宏
#define _DEBUG
这类宏适用于条件编译的,后面有其他预编译处理这类指令来判断这个宏是否已经被定义过了
1、当前的行号
2、文件名
3、4:日期、时间
像函数的宏
最后输出的值为125
带参数的宏
在大型程序的代码中适用非常普遍
可以非常复杂,如“产生”函数(在#和##帮助下)
一切都要带括号(整个值,参数出现的地方都要)
比函数效率高,牺牲空间换取效率
项目
在DevC中新建一个项目,然后把几个源代码文件加入进去
对于项目,DevC的编译会把一个项目中所有的源代码文件都编译后,链接起来
有的IDE有分开的编译和构建两个按钮,前者是对单个源代码文件编译,后者是对整个项目做链接
“ ”还是< >
#include有 两种形式来指出要插入的文件
“ ”要求编译器首先在当前目录(.c文件所在的目录)
寻找这个文件,如果没有,到编译器指定的目录去
< >让编译器只在指定的目录去找
翻译器自己知道自己的标准库的头文件在哪里
环境变量和编译器命令行参数也可以指定寻找头文件的目录
#include的误区
#include不是用来引入库的
stdio.h里 只有printf的原型,printf的代码在另外的地方,某个.1ib(Windows)或 .a(Unix)中
现在的C语言编译器默认会引入所有的标准库
#include <stdio.h>只是为了让编译器知道printf函数的原型,保证你调用时给出的参数值是正确的类型
不对外公开的函数
在函数前面加上static就使得它成为只能在所在的编译单元中被使用的函数
在全局变量前面加上static就使得它成为只能在所在的编译单元中被使用的全局变量
标准头文件结构
运用条件编译和宏,保证这个头文件在一个编译单元中只会被#include一次
#pragma once也能起到相同的作用,但是不是所有的编译器都支持
EOF
C语言中,EOF常被作为文件结束的标志。还有很多文件处理函数处错误后的返回值也是EOF,因此常被用来判断调用一个函数是否成功。
例如: