程序环境和预处理(三)

简介: 程序环境和预处理(三)

程序环境和预处理(二)+https://developer.aliyun.com/article/1385005

3.2.7 命名约定

一般来讲函数的宏的使用语法很相似。所以语言本身没法帮我们区分二者。

那我们平时的一个习惯是:

把宏名全部大写

函数名不要全部大写

3.3 #undef

这条指令用于移除一个宏定义

#include <stdio.h>
#define MAX(x,y) ((x)>(y)?(x):(y))
int main()
{
  int n = MAX(3, 5);
  printf("%d\n", n);
#undef MAX
  int n = MAX(10, 5);
  printf("%d\n", n);
  return 0;
}

当程序编译时会报错。

3.4 命令行定义

许多C 的编译器提供了一种能力,允许在命令行中定义符号。用于启动编译过程。 例如:当我们根据同一个源文件要编译出一个程序的不同版本的时候,这个特性有点用处。(假定某个 程序中声明了一个某个长度的数组,如果机器内存有限,我们需要一个很小的数组,但是另外一个机器 内存大些,我们需要一个数组能够大些。)

编译指令:

//Linux 环境演示

gcc -D ARRAY_SIZE=10 programe.c

3.5 条件编译

在编译一个程序的时候我们如果要将一条语句(一组语句)编译或者放弃是很方便的。因为我们有条件编译指令,条件满足就编译,条件不满足就不编译。

常见的条件编译指令:

1.单个条件编译

#if 常量表达式

       //...

#endif

#define M 1
int main()
{
#if M==1
  printf("hehe\n");
#endif
}

说明:if语句和#if不同,#if 表达式为假,在预处理阶段就会将代码删除。

2.多个分支的条件编译

#if 常量表达式

       //...

#elif 常量表达式

       //...

#else

       //...

#endif

3.判断是否被定义

如果定义了就执行

#if defined(symbol)

       //…

#endif

#ifdef symbol

       //…

#endif

如果没有定义就执行

#if !defined(symbol)

       //…

#endif

#ifndef symbol

       //…

#endif

4.嵌套指令

#if defined(OS_UNIX)

       #ifdef OPTION1

               unix_version_option1();

       #endif

       #ifdef OPTION2

               unix_version_option2();

       #endif

#elif defined(OS_MSDOS)

       #ifdef OPTION2

               msdos_version_option2();

       #endif

#endif

3.6 文件包含

我们已经知道, #include 指令可以使另外一个文件被编译。就像它实际出现于 #include 指令的地方 一样。

3.6.1 头文件被包含的方式:

本地文件包含:

       #include "filename"

查找策略:先在源文件所在目录下查找,如果该头文件未找到,编译器就像查找库函数头文件一样在标 准位置查找头文件。 如果找不到就提示编译错误。

库文件包含:

        #include                

查找头文件直接去标准路径下去查找,如果找不到就提示编译错误。

对于库文件也可以使用 “” 的形式包含。 但是这样做查找的效率就低些,当然这样也不容易区分是库文件还是本地文件了。

3.6.2 嵌套文件包含

当头文件重复包含,在预处理阶段就会重复保存文件中的内容,这样大大降低了工作效率。为了解决头文件重复包含的问题,我们可以使用条件编译。

#ifndef  TEST_H
#define  TEST_H
    //头文件的内容
#endif   //__TEST_H__

解读:如果没有定义TEST_H,就执行下面的语句,第一次调用,一定没有定义TEST_H,所以执行下面的语句,定义TEST_H,头文件中的内容参与编译;当第二次在调用时,已经定义了 TEST_H,下面的代码不参与编译。

       #pragma once

本次的内容到这里就结束啦。希望大家阅读完可以有所收获,同时也感谢各位读者三连支持。文章有问题可以在评论区留言,博主一定认真认真修改,以后写出更好的文章。

相关文章
|
搜索推荐 vr&ar UED
【专栏:交互与用户体验篇】网页排版与可读性优化
【4月更文挑战第30天】网页排版与可读性关乎用户体验和信息传递效率。良好排版能提升用户体验,增强信息传达,树立专业形象,促进用户参与。原则包括简洁明了、一致性、层级分明和适应性。优化方法涉及字体选择、字号、行距、颜色搭配、留白、标题使用等。案例分析展示了新闻、电商、博客网站的不同排版策略。未来,响应式、动态排版及VR/AR技术将带来新机遇。重视排版与可读性,以适应用户需求和市场变化,打造优质网站。
485 1
|
存储 边缘计算 物联网
这只猫在云端定居了?边缘计算在天猫精灵云应用上的落地实践
IoT的概念早已飞入寻常百姓家,在你我的日常生活中发挥着“智能”作用。比如,智能家居、智慧照明、GPS 导航、手机计步器等。未来,随着用户和技术的延伸和拓展,物联网的信息交换和通信价值将会被继续放大。那么问题来了,如此庞大的设备和信息量,如何进行管理和整合重组?如何高效准确智能地对用户需求和实际应用场景做出反应?如何让数据流动产生更大价值?如何向着更智慧加速迈进?边缘计算,就是让IoT终端更智慧的一把钥匙。今天,边缘酱找来了天猫精灵和阿里云边缘计算的技术2位小哥,一起来为大家讲讲边缘计算如何让IoT终端有大智慧!
2548 0
这只猫在云端定居了?边缘计算在天猫精灵云应用上的落地实践
|
人工智能 云栖大会
幸好,赶在重庆云栖大会之前出道了!
没错 我们就是阿里F4 (阿里云、钉钉、支付宝、天猫) 接下来 说说我们出道这件事 本打算秘密出道 没想到刚出重庆江北机场 就被一群死忠粉团团围住 坐上官方出道指定用车荣威RX8 开启出道之行 这颗蛋蛋也忒大了 (还好车够大) 冒着44度的高温来到重庆 当然不只是为了吃喝玩乐 为重庆智博会站台 才是我们这次出道的真正目的 对了对了 还要介绍一下云栖大会·重庆峰会 毕竟看点多多呀 看点1 工业互联网平台发布 据说,这个平台可以帮助80%的中小企业及制造企业,降低20%以上的开发成本与时间,提高效益。
2341 0
|
存储 缓存 NoSQL
RedisTemplate之String类型常用方法详解
RedisTemplate之String类型常用方法详解
1786 0
|
13天前
|
人工智能 JSON 供应链
畅用7个月无影 JVS Claw |手把手教你把JVS改造成「科研与产业地理情报可视化大师」
LucianaiB分享零成本畅用JVS Claw教程(学生认证享7个月使用权),并开源GeoMind项目——将JVS改造为科研与产业地理情报可视化AI助手,支持飞书文档解析、地理编码与腾讯地图可视化,助力产业关系图谱构建。
23495 11
畅用7个月无影 JVS Claw |手把手教你把JVS改造成「科研与产业地理情报可视化大师」
|
17天前
|
人工智能 缓存 BI
Claude Code + DeepSeek V4-Pro 真实评测:除了贵,没别的毛病
JeecgBoot AI专题研究 把 Claude Code 接入 DeepSeek V4Pro,跑完 Skills —— OA 审批、大屏、报表、部署 5 大实战场景后的真实体验 ![](https://oscimg.oschina.net/oscnet/up608d34aeb6bafc47f
5488 20
Claude Code + DeepSeek V4-Pro 真实评测:除了贵,没别的毛病
|
18天前
|
人工智能 JSON BI
DeepSeek V4 来了!超越 Claude Sonnet 4.5,赶紧对接 Claude Code 体验一把
JeecgBoot AI专题研究 把 Claude Code 接入 DeepSeek V4Pro 的真实体验与避坑记录 本文记录我将 Claude Code 对接 DeepSeek 最新模型(V4Pro)后的真实体验,测试了 Skills 自动化查询和积木报表 AI 建表两个场景——有惊喜,也踩
6553 16
|
7天前
|
人工智能 缓存 Shell
Claude Code 全攻略:命令大全 + 实战工作流(完整版)
Claude Code 是一款运行在终端环境下的 AI 编码助手,能够直接在项目目录中理解代码结构、编辑文件、执行命令、执行开发计划,并支持持久化记忆、上下文压缩、后台任务、多模型切换等专业能力。对于日常开发、项目维护、快速重构、代码审查等场景,它可以大幅减少手动操作、提升编码效率。本文从常用命令、界面模式、核心指令、记忆机制、图片处理、进阶工作流等维度完整说明,帮助开发者快速上手并稳定使用。
1689 3