新闻详情

新闻详情

首页 / 资讯中心 / 详情

C语言——文件包含,条件编译,不同模块函数组成完整内容的方式

发布时间:2026/10/1 19:29:07来源:尧图网络
C语言——文件包含,条件编译,不同模块函数组成完整内容的方式
文件包含#include文件名//默认到系统的标准路径下寻找要包含的头文件#includ3文件名//默认先到当前位置下 寻找要包含的头文件如果找到包含进来如果没找到才到系统的标准路径下寻找说明1include这个预处理命令执行后用文件中的内容替换这个命令所在的位置2使用时 //如果是系统相关的头文件用 //如果自己写的头文件用条件编译语义判断标识符是否定义如果定义了——真 选择程序段1如果没定义——假 选择程序段2如下代码是定义后执行结果是yes#includestdio.h #define N int main(void) { #ifdef N printf(yes\n); #else printf(no\n); #endif return 0; }以下是与前面逻辑相反的情况即先判断假再判断真还有下面这种用于控制哪些语句运行#if 表达式 程序段1 #else 程序段2 #endif#if 1printf(yes\n);#endif执行结果yes#if 0printf(yes\n);#endif不运行这段打印#if 后也可以用计算表达式比如#if 12文件包含实现好的功能 某个模块独立的.c程序提供或者打包成库文件这时候要把大量的各个模块的.c文件结合起来一个.c对应有一个头文件.c——实现具体功能的具体代码比如函数.h——头文件——放的是自身需要用到的宏类型说明函数声明//变量的定义不能放到头文件原因变量定义 int a10; 会分配内存头文件会被多次 #include 粘贴到不同.c里就造成【同一个变量多次分配内存】链接时报重复定义错误#ifndef 头文件名 // 大写前后下划线#define 头文件名1,2两步过程是为了防止重复包含的问题如果遇到#includestdio.h#includestdio.h两次头文件多次包含了文件可能会报错这个能阻止多次使用#ifndef if not defined翻译如果没有被定义1. 第一次 #include getDays.h检查 _GETDAYS_H_ 有没有被定义如果没有就执行 #define _GETDAYS_H_ 把这个宏标记定义上往下执行把里面的函数声明加载进来2. 第二次又 #include getDays.h检查 _GETDAYS_H_ 已经定义过了#ifndef 条件不成立直接跳过中间全部代码作用防止同一个头文件被重复粘贴避免重复声明报错保护声明的内容只出现一次举一个实际例子找最大值最小值#includestdio.h //求最大值 int getMax(int x, int y) { if(x y) return x; else return y; } //求最小值 int getMin(int x, int y) { if(x y) return x; else return y; } int main(void) { int a,b; printf(请输入两个整数); scanf(%d%d, a, b); int max getMax(a,b); int min getMin(a,b); printf(最大值%d最小值%d\n, max, min); return 0; }以上是一个单独的.c的找最大值最小值的代码以下是找最大值的.h文件#ifndef __MAX_H__ //如果先前没有定义过就定义这个标识符包含声明内容 #define __MAX_H__ //目的是防止后续重复使用这个头文件会重复声明 int getMax(int x,int y); //声明函数用于后续调用知道有这个函数在 #endif //结束以下是找最大值的.c文件#include max.h int getMax(int x, int y) { return xy ? x:y; }以下是找最小值的.h文件#ifndef __MIN_H__ #define __MIN_H__ int getMin(int x,int y); #endif以下是找最小值的.c文件#include min.h int getMin(int x, int y) { return xy ? x:y; }以下是主函数#includestdio.h //调用标准库 #include max.h //调用获取最大值函数的声明 #include min.h //调用获取最小值函数的声明 int main(void) { int a12,b7; printf(max%d\n, getMax(a,b)); printf(min%d\n, getMin(a,b)); return 0; }情况1全部写在同一个 .c 文件两种写法二选一1. 函数写在main前面编译器从上往下读提前看到函数实现main直接调用不用单独写声明。​2. 函数写在main后面必须在main之前写函数声明告诉编译器这个函数的返回值、参数。情况2分模块多个.c函数的实现代码放到另一个 .cmax.c。但是main.c不知道这个函数依然需要函数声明。方案A直接在main.c手写一行 int getMax(int x,int y);缺点项目大了几十个函数每个文件都复制粘贴声明一旦函数参数改了所有地方全部手动改极易漏改、出错。方案B把这一堆声明统一放进 .h头文件所有需要调用这个模块的 .c 只写一句 #include max.h 。只要修改头文件里的声明所有包含这个头的文件自动同步统一管理。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

猎杀对决网络波动排查:别甩锅网卡,延迟、抖动、丢包才是关键 2026/10/1 19:29:03

猎杀对决网络波动排查:别甩锅网卡,延迟、抖动、丢包才是关键

上周四晚上,我在猎杀对决里蹲一个点,突然听到两步外的脚步声,开镜、瞄准、开枪,三发子弹全打在对方身后,然后我被一把短管霰弹枪带走。队友在语音里丢下一句“你网卡了吧”,我盯着右上角那个一直显示绿色的…

阅读更多 →
AI安全中间件:可验证、可追溯、可干预的治理架构 2026/10/1 19:29:03

AI安全中间件:可验证、可追溯、可干预的治理架构

1. 项目概述:一个被误读但极具现实意义的技术动作“自研‘中国版Mythos’,360入选国家AI安全漏洞库支持单位”——这个标题在社交平台传播时,常被简化为“国产Mythos来了”或“360搞了个AI安全大模型”,进而引发两类典型误读&…

阅读更多 →
AI工程从零构建:完整路线图、最小闭环与踩坑实战 2026/10/1 19:29:02

AI工程从零构建:完整路线图、最小闭环与踩坑实战

把 ai-engineering-from-scratch 当项目名的人,大概率不是想再装个环境跑通 demo 了事,而是想把这门技术栈从地基开始重新立一遍。这几年我前后面试过不少候选人,简历上写着“熟悉 AI 开发”,但一聊到数据怎么准备、模型怎么评估、…

阅读更多 →
AWVS 14安装与生产级部署实战指南 2026/10/1 19:29:02

AWVS 14安装与生产级部署实战指南

1. 项目概述:AWVS 14到底是什么,它解决的是哪类人的哪类问题?Acunetix Web Vulnerability Scanner(简称AWVS)是网络安全领域里一款久负盛名的自动化Web应用安全扫描工具。它不是黑客玩具,也不是CTF比赛里的…

阅读更多 →
TensorFlow 2024实战:从安装到部署的避坑指南 2026/10/1 19:28:56

TensorFlow 2024实战:从安装到部署的避坑指南

做深度学习这一年多,我最大的感受就是:框架选型这件事,真的是“年年都有新变化,但总有几个老面孔躲不掉”。2024 年你随便打开一个招聘网站,要求里写“熟悉 TensorFlow 或 PyTorch”的比比皆是,而那些真正在…

阅读更多 →
TensorFlow 2024实战指南:从环境搭建到工业部署的核心价值 2026/10/1 19:28:56

TensorFlow 2024实战指南:从环境搭建到工业部署的核心价值

最近后台收到好几条私信,都是同一个问题:“现在不是都用PyTorch了吗,学TensorFlow还有意义吗?” 这种问题我看一次就想笑一次。TensorFlow发布快十年了,依然是工业界部署端的“老大哥”,2024年它的生态不但…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉