预处理命令
#include(文件包含命令)
#define(宏定义命令)
#undef
#if(条件编译)
#ifdef
#ifndef
#elif
#endif
defined函数(与if等结合使用)
简述
我们在写程序是预处理命令的意思,用在什么地方,什么时候用,使用技巧在哪里
include(文件包含命令)
尖括号:#include <stdio.h>
尖括号:编译器会到系统路径下查找头文件
也就是说编译器安装目录的头文件用尖括号,象std库
双引号 :#include “usrctrl.h”
双引号:编译器会先在当前目录下查找头文件,如果没有找到,再到系统路径下查找
也就是说我们自己生成项目工程目录的头文件用双引号,
include的作用:是把包含文件内容写入c文件
包含文件一般是申明的头文件,但这不是绝对的,
他可以是c文件,一般c文件是独立的数组数据,方便维护
有时还可使其他文件,xxx.txt
u32 pcm_data[]={#includle “d:/xxx.txt”} 这样也可以,直接把txt文件初始化到数组里,但数据必须是数组接受的
int mapping_n8[256] = {
#include "mapping_n8.txt"
};
mapping_n8.txt里的内容是以逗号隔开的int型数据
‘’’
我们完全可以把其中部分代码放进另一个文件,比如file.txt,然后包含进来
#include <stdio.h>intmain(){int x,y;#include “file.txt”return 0;}//file.txtx = 3;y = 2;printf(“%d\n”,x+y);
现实中,没人会这样写,这个例子就是为了演示include的本质局势简单的包含功能
比如我们定义了一个数组
元素非常多,放在源程序里影响看代码,可以放在另外的文本文件里保存,既让代码清爽,又易于修改和维护
//src.cchar *namelst[] = {#include “names.txt”};//names.txt“Tom”,“Jack”,......“vicky”
#include指令必须要独占一行 ,因为预处理器会将被包含的文件的全部内容从当前行的下一行开始插入,前后不为空白,就会出错
注意事项
1、一个 #include 命令只能包含一个头文件
2、同一个头文件可以被多次引入,多次引入的效果和一次引入的效果相同,因为头文件在代码层面有防止重复引入的机制
3、头文件包含允许嵌套
重要的话直说一遍,下面学习头文件在代码层面如何防止重复引入的机制
防止重复引入的机制:# ifndef
防止重复引入的机制:# ifndef 有多重用法
#ifndef <标识>
#define <标识>……#endif
一.头文件:tab_calc.h
#ifndef __TAB_CALC_H___
#define __TAB_CALC_H___
// #ifdef c_cplusplus
// extern "C" {
// #endif
#include "user_config.h"
//#define xDEBUG
#ifdef xDEBUG
#include <stdio.h>
#include <stdlib.h>
#define DEBUG_PRINT(fmt, ...) \do { \printf(fmt, ##__VA_ARGS__); \} while (0)
#define DEBUG_INFO(fmt, ...) \do { \printf(fmt, ##__VA_ARGS__);\ printf("Function: %s, File: %s, Line: %d\n", __FUNCTION__, __FILE__, __LINE__);\} while (0)
#define log_d(fmt, ...) \do { \printf(fmt, ##__VA_ARGS__); \printf("Function: %s, File: %s, Line: %d\n", __FUNCTION__, __FILE__, __LINE__); \} while (0)#else#define DEBUG_PRINT(fmt, ...) do {} while (0)
#define log_d(fmt, ...) do {} while (0)
#define DEBUG_INFO(fmt, ...) do {} while (0)
#endif#ifndef EXPORT__TAB_CALC_H___#define EXTERN#else#define EXTERN extern #endif typedef enum
{TABD6 = 0X00, // 3*6 TABD8 , TABD10 , TABD12 , TABD14 ,TABD16
} d_tab_type;EXTERN s32* get_tab_data(u8 xtab);#undef EXTERN
/*******************************************/
// #ifdef c_cplusplus
// }
// #endif
#endif
#ifndef TAB_CALC_H_
#define TAB_CALC_H_
“中间内容”
#endif
意思是:在include时,__TAB_CALC_H___没有定义就写入"中间内容"到c文件 ,#ifndef __TAB_CALC_H___有没有被#define,写入"中间内容"到c文件
include的作用是把包含文件内容写入c文件:
例如:a.c include了三个头文件m.h n.h k.h tab_calc.h
这三个头文件m.h n.h k.h里面都包含了tab_calc.h,这时,“中间内容” 要在c文件重复写入四次,这样编译时,有四次重名错
但有了#ifndef就不样了,
在编译前,有一个编译预处理:
预处理先看__TAB_CALC_H___有没有被#define
m.h包含了tab_calc.h是第一个,__TAB_CALC_H___没有被#define,写入"中间内容"到c文件,同时__TAB_CALC_H___被#define
,后面__TAB_CALC_H___被#define,他遇到__TAB_CALC_H___就会跳出,不会写
有时间继续