c程序编译预处理命令那些事
预处理命令
#include(文件包含命令)
#define(宏定义命令)
#undef
#if(条件编译)
#ifdef
#ifndef
#elif
#endif
defined函数(与if等结合使用)
简述
我们在写程序是预处理命令的意思,用在什么地方,什么时候用,使用技巧在哪里
include(文件包含命令)
尖括号:#include <stdio.h>
尖括号:编译器会到系统路径下查找头文件
也就是说编译器安装目录的头文件用尖括号,象std库
双引号 :#include “usrctrl.h”
双引号:编译器会先在当前目录下查找头文件,如果没有找到,再到系统路径下查找
也就是说我们自己生成项目工程目录的头文件用双引号,
include的作用:是把包含文件内容写入c文件
包含文件一般是申明的头文件,但这不是绝对的,
他可以是c文件,一般c文件是独立的数组数据,方便维护
有时还可使其他文件,xxx.pcm
u32 pcm_data[]={#includle “d:/xxx.pcm”} 这样也可以,直接把pcm的音频文件初始化到数组里,但数据必须是数组接受的
注意事项
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___就会跳出,不会写
有时间继续