当前位置: 首页 > news >正文

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___就会跳出,不会写

有时间继续


http://www.mrgr.cn/news/69113.html

相关文章:

  • Java基础——多线程
  • Java poi 模板导出Word 带图片
  • 开源三代示波器的高速波形刷新方案开源,支持VNC远程桌面,手机,Pad,电脑均可访问(2024-11-11)
  • PostgreSQL中表的数据量很大且索引过大时怎么办
  • 【JAVA】Java基础—面向对象编程:继承—重写父类方法
  • nginx证书流式响应配置
  • 电工领域文档规范引用格式说明
  • 装杯 之 Linux指令【补充篇】
  • 图形几何之美系列:仿射变换矩阵
  • 了解信息物理系统(CPS,Cyber-Physical Systems)
  • Java 函数接口Comparator和Comparable【比较器接口】详解与示例
  • 深入理解指针3
  • 3242. 设计相邻元素求和服务
  • 运维规范心得
  • 【linux】再谈网络基础(二)
  • 如何判断 Hive 表是内部表还是外部表
  • C#入门 017 字段,属性,索引器,常量
  • 深入 MyBatis-Plus 插件:解锁高级数据库功能
  • ProcessBuilder调用脚本执行
  • Qt使用属性树(QtProPertyBrowser)时,引用报错#include “QtTreePropertyBrowser“解决方案
  • 星期-时间范围选择器 滑动选择时间 最小粒度 vue3
  • 浅谈web性能测试
  • 智能问答系统流程详解:多轮对话与模型训练的技术要点及案例
  • Unet++改进11:添加MLCA||轻量级的混合本地信道注意机制
  • Linux可视化工具cockpit
  • tar | 打包 | 压缩 | 文件搜索 | 常用命令(二)