预处理指令、Makefile

Makefile编译和链接 一、编译和链接 一个C/C++文件要经过预处理(preprocessing)、编译(compilation)、汇编(assembly)和链接(linking)等4步才能变成可执行文件。在日常交流中通常使用“编译”统称这4个步骤。 1、预编译(预处理) 在集成开发环境中,编译,链接是同时完成的。其实,C语言编译器在对源代码编译之前,还需要进一步的处理:预编译。所以,完整的步骤是:预编译 ->编译 -> 链接。 预编译的主要作用如下: 将源文件中以“#include”格式包含的文件复制到. 阅读详情

预处理指令

程序员所编写的C代码不能直接被编译器编译,需要一段程序把C代码翻译成
标准C代码。
翻译的过程叫预处理,执行翻译的程序叫做预处理器,被翻译的代码叫做预处
理执行指令,以#开头的都是预处理指令。

查看预处理结果:
    gcc —E code.c  把预处理结果直接显示到终端上
    gcc -E code.c -o code.i  把预处理的结果存储到.i结尾的文件中
一、预处理指令的分类
1、文件包含
#include 
     #include <>    从系统指定的目录下查找头文件并导入
     #include ""   先从当前目录下查找头文件,如果找不到,再从系统
     指定的目录下查找头文件并导入

     编译参数 -I /路径 来指定头文件的加载路径
     系统指定目录是通过设置环境变量来指定 ~/.bashrc
2、宏常量
 #define 宏名 字面值数据 (末尾不加分号)    例:#define  MAX 100
 如果在代码中使用了宏,在预处理时会把所有的宏替换成宏名后面的
 字面值数据
 
 优点:提高可扩展性(批量性修改)、因为是常量,提高了安全性、
 提高可读性、可以与case配合使用
 
 注意:  一般宏名全部大写,末尾不加分号,不能直接换行(可以
 使用续行符\)
 
 预定义的宏:
     __func__    获取函数名  %s
     __FILE__    获取文件名  %s
     __DATE__    获取当前日期    %s
     __TIME__    获取当前时间    %s
     __LINE__    获取当前行号    %d
3、宏函数
#define FUNC(arg)  arg*10
带参数的宏,不是真正的函数,使用宏函数的位置会被替代成宏函数
后面的代码,提供的参数会被替换到相应的参数的位置

注意:宏函数也可以使用大括号来保护代码
不检查参数的类型,没有传参,没有返回值,只有计算结果
    #define SUM (a,b) a+b
    1、把代码中使用的宏函数替换为宏函数后面的代码 a+b
    2、把宏函数代码中使用的参数替换为调用者提供的参数
注意:宏函数不能直接换行,如果需要换行要在末尾加续行符\

宏的二义性:
    由于宏代码所处的位置、参数不同导致宏有不同的功能,这叫做宏的二义性
    如何避免宏的二义性:
        宏函数整体加小括号、每个参数都要加小括号
        注意:使用宏函数时不要提供带自变运算符的变量作为参数

    运算符:
        # 把宏函数的参数变成字符串
        ##合并两个参数变成标识符

实现一个交换两个变量的宏函数

#define swap(a,b)   {typeof(a) temp = (a);(a) = (b);(b) = temp;}  
4、条件编译:(顶格写)

根据条件让代码是否参与最终的编译

    头文件卫士:防止头文件被重复包含 
    #ifndef FILENAME_H
    #define FILENAME_H
    #endif//FILENAME_H

    版本控制
    #if VERSON >=3
    #elif VERSON >=2
    #elif VERSON >=1
    #else
    #endif

    编译器控制
    #if __cplusplus
        printf("C++编译器\n");
    #else
        printf("C编译器\n");
    #endif

    #if __x86_64__
        printf("64位操作系统\n");
    #elif __i386__
        printf("32位操作系统\n");
    #endif

    判断、调试、上线    gcc code.c -DDBUG  //-D编译时定义宏
    #ifdef
    #else
    #endif

    定义打印调试信息的宏函数
    #include <stdio.h>
    #ifdef DEBUG
        #define debug(...)  printf(__VA_ARGS__)
    #else
        #define debug(...)
    #endif

    定义打印错误信息的宏函数
    以上两个宏函数会使用即可
    #define error(...) printf("%s %s %s:%d:%m %s %s\n",\
     __FILE__,__func__,__VA_ARGS__,__LINE__,__DATE__,__TIME__)

    int main(int argc,const char* argv[])
    {
        int num  = 10; 
        int ret  = scanf("%d",&num);
        debug("ret=%d\n",ret);

    }
5、常见的笔试面试题:
1、定义一个100年有多少秒的宏
    #define YEAR_SEC (3600*24*365*100u)

2、在类型重定义时#define 和 typedef 区别?
    如果是普通类型,他们的功能没有任何区别,
    #define INT int
    typedef int INT

    如果是指针类型
    #define INTP int*
    typedef int* INTP
    例:
    INTP p1,p2,p3;
        如果是#define     只有p1是指针变量,p2 p3都是int类型变量
        如果是typedef     p1p2p3都是指针变量  

    如果:
    typedef int* pint;
    #define PINT int*

    那么:
    const pint p ;//p不可更改,但p指向的内容可更改
    const PINT p ;//p可更改,但是p指向的内容不可更改。

    pint是一种指针类型 const pint p 就是把指针给锁住了 p不可更改
    而const PINT p 是const int* p 锁的是指针p所指的对象。


3、定义常量时,#define和const的区别

    (1) 编译器处理方式不同
      define宏是在预处理阶段展开。
      const常量是编译运行阶段使用。

    (2) 类型和安全检查不同
      define宏没有类型,不做任何类型检查,仅仅是展开。
      const常量有具体的类型,在编译阶段会执行类型检查。

    (3) 存储方式不同
      define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存。
      (宏定义不分配内存,变量定义分配内存。
      const常量会在内存中分配(可以是堆中也可以是栈中)。

    (4)const  可以节省空间,避免不必要的内存分配。


4、宏函数与函数的区别?
    他们是什么?
        宏函数:不是真正的函数,只是代码替换,只是用法像函数
        函数:一段具有某项功能代码的集合,会被编译成二进制指令,存储到
        代码段中,函数名就是该段内存的首地址、有独立的命名空间、栈空间

    有什么不一样?
        函数:  有返回值、   类型检查、安全、入栈、出栈、速度慢、跳转
        宏函数:只有运算结果、  通用、 危险、替换、    、速度快、冗余
二、头文件
    重点:头文件中只能编写声明语句,不能有定义语句
    全局变量的声明
    函数声明
    宏常量
    宏函数
    typedef 类型重定义
    结构、联合、枚举的类型声明
头文件的编写规则:
1、为每个.c文件写一份.h文件,.h文件是对.c文件的说明
2、如果需要用到某个.c文件的变量、函数、宏,只需要把它的头文件导入即可
3、.c文件也需要导入自己的.h文件,目的是为了让声明与定义一致
头文件的相互包含:
假如a.h中包含了b.h的内容,而b.h又需要包含a.h的内容,这种会导致编译出错

错误 :未知的类型名‘xxx’,一般都是头文件相互包含所导致的,也可能是复制
粘贴时头文件宏名忘记改

解决方法:把a.h中需要的内容和b.h中需要的内容提取出来,写成一个c.h
三、Makefile
Makefile是由一系列编译指令组成的可执行文件,也叫做编译脚本
在终端执行make命令会自动执行Makefile脚本中的编译指令,它可以根据文件的最后修改时间,
来判断哪些文件需要被编译,哪些文件不需要被编译,从而大大的提高编译效率

编译规则:
    1、如果该项目没有被编译过,则编译全部的.c文件,并链接成可执行文件
    2、如果某些.c文件被修改,则只编译修改过的.c文件,并重新链接新的可执行文件
    3、如果某些.h文件被修改,所有依赖它的.c都要重新编译并链接

一个最简单的Makefile脚本:
执行目标:依赖
编译指令
被依赖的目标1:依赖的文件
编译指令
被依赖的目标2:依赖的文件
编译指令
…
负责清理的执行目标:
rm …

通用的Makefile脚本
 CC=gcc
STD=-std=gnu99
LIB=-lm
INC=-I./include
BIN=SAMS
FLAG=-Wall -Werror
OBJ=admin.o dao.o list.o main.o sams.o student.o teacher.o tools.o

all:$(OBJ)
	$(CC) $(OBJ) $(LIB) -o $(BIN)

%.o:%.c
	$(CC) $(STD) $(FLAG) $(INC) -c $< -o $@

clean:
	rm -rf $(OBJ) $(BIN)
		

论文翻译:Automatic Lesson Plan Generation via Large Language Models with Self-critique Prompting 在本文中,我们利用大型语言模型(LLMs)的理解和生成能力来自动生成定制化的课程计划。这解决了传统计划可能无法充分满足不同教学环境和学生群体的特定需求的常见挑战。我们提出了一个新颖的三阶段过程,包括使用检索增强生成(RAG)逐步生成课程计划的每个关键组成部分,通过LLMs进行自我批评,以及随后的细化。我们使用这种方法为小学2至5年级生成了涵盖80多个主题的数学课程计划。邀请了三位经验丰富的教育工作者制定全面的课程计划评估标准,然后使用这些标准将我们的LLM生成的课程计划与同一主题的实际课程计划进行基准比较。 阅读详情

相关推荐

Codesys电子凸轮从入门到应用:手把手教你用MC_CamIn/MC_CamOut实现主从轴同步

本文详细介绍了如何在Codesys平台上使用MC_CamIn和MC_CamOut功能块实现电子凸轮的主从轴同步控制。从环境配置、轴使能到凸轮表创建与动态切换,提供了完整的程序编写指南和调试技巧,帮助工程师快速掌握工业自动化中的高精度运动控制技术。

weixin_26878995的博客 277

【MakeFile详解】

Makefile变量定义跟Shell变量定义刚好相反!Shell变量定义时,=两边不能有空格.Makefile 变量定义,=两边一定要有空格Shell变量用{}来保护变量名,而Makefile变量用()来保护变量名Makefile的变量定义要独立于规则之外,是有定义先后顺序的要求一般要放在所有规则前面进行定义=与:=区别两者都用于变量赋值,:=是简单赋值,=带递归引用如=后面是变量,则变量本身值可能还要进行运算。

j8267643的博客 3086

AI辅助发明专利撰写实战:30分钟高效生成高质量技术专利文档

在技术专利撰写领域,尤其是软件、算法或系统架构相关的发明专利,如何将创新的技术构思快速、规范地转化为符合《专利法》要求的申请文件,是许多开发者和技术团队面临的共同挑战。传统的人工撰写方式不仅耗时耗力,对撰写人的法律和技术双重背景要求极高,还容易因格式或术语不规范导致审查意见增多。本文将分享一套利用 AI 辅助工具,系统化、高效率地完成一篇高质量发明专利说明书撰写的实战流程。通过清晰的步骤拆解、可复制的提示词(Prompt)工程以及关键注意事项,即使是首次接触专利撰写的开发者,也能在短时间内掌握从技术方案梳理

子夜轻风 954

Makefile小结

预处理:gcc -E hello.c -o hello.i     1.展开宏定义(#define)     2.处理所有条件预编译指令(#if、#ifdef、#else、#else if、#endif)     3.处理#include预编译指令,将被包含的文件插入到该项预编译指令当中(递归执行)     4.删除所有的注释     5.保留所有#progrma编译器指令,因为编译器需要使用它们 编译:编译过程就是把预处理完的文件进行一系列词法分析、语法分析、语义分析及优化后生成相应的汇编代码文件。   

Learning is life的博客 373

AI赋能运筹优化:从参数生成到智能求解的工程实践

运筹学通过线性规划、整数规划等数学模型,为供应链、物流、生产排程等复杂决策问题寻找最优解,其核心价值在于提升资源利用效率与决策科学性。传统方法依赖精确的输入参数与专家经验,面临数据不准、建模门槛高、求解调优难等挑战。人工智能技术的引入,正从原理层面重塑这一流程:通过深度学习模型生成更贴合现实的动态参数(如需求分布、行驶时间),利用自然语言处理降低建模门槛,并借助强化学习对求解器进行智能参数调优。这种AI与运筹学的融合,在工程实践中显著提升了优化系统的自适应能力与求解效率,使其在应对实时交通、柔性生产调度等动

weixin_26913055的博客 595

非华为电脑也能用!华为电脑管家完美安装教程来了

GitHub 上有一个开源项目 ​****​,专门解决“非华为设备无法安装华为电脑管家”的问题。它通过智能模拟 + DLL 劫持技术,绕过官方对硬件型号的检测,让你在联想、戴尔、华硕甚至 DIY 主机上也能流畅使用华为电脑管家!⭐ 项目已获 ​700+ Stars​,社区活跃,持续更新,兼容性优秀!科技不该有围墙。如果你成功在非华为电脑上跑起了 PCManager,欢迎在评论区晒出你的设备型号 + 使用体验!也别忘了把这篇推文分享给同样“眼馋”华为生态的朋友 ~📱 ​关注我们。

程序员朱永胜 4928

C语言入门:进阶篇05 预处理指令与Makefile

本文是有关预处理指令的相关内容。一个好的和专业的程序员,makefile 还是要懂。尤其在 Unix 下的软件编译,你就不能不自己写 makefile 了,会不会写 makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。

snowysc的博客 499

PADS Layout中快速导入自定义元器件封装的实用技巧

本文详细介绍了在PADS Layout中高效导入自定义元器件封装的实用技巧。针对封装“找不到”、“对不上”、“导不进”三大痛点,系统梳理了从封装文件来源识别、库规划管理,到三种核心导入场景(从库文件添加、从其他设计借用、处理第三方格式)的完整操作流程,并提供了导入后的关键验证清单与常见问题排查方法,旨在帮助硬件工程师快速掌握这一提升设计效率的关键技能。

weixin_29302047的博客 375

make 预处理

shell 调用

rubikchen的博客 197

SAP VF01开票报错:出口贸易数据不完整

找了半天资料,最后发现是没有维护凭证抬头的数据;由于我不是SD模块顾问,整体流程使用的是原本环境里面的数据,用新建工厂引用,所以也不知道为啥会出发这个贸易业务。正常传到FICO模块,生成会计凭证、获利分析、利润中心及CO凭证。需要维护这三个字段后才能正常转到FI生成会计凭证。VF01开票报错:出口贸易数据不完整。

MaiKouBei的博客 1543

Autosar配置——导入DBC后配置SecOC同步报文和同步请求报文

在Autosar中,安全性是一个重要的考虑因素,而SecOC(Secure On-Board Communication)是一种用于保护通信数据完整性和安全性的安全机制。在上述示例中,我们配置了同步报文和同步请求报文的属性。接下来,我们需要在Autosar中配置同步报文和同步请求报文。同步报文用于在通信双方之间同步SecOC状态,而同步请求报文用于请求SecOC的状态信息。通过以上配置,我们成功地导入了DBC文件,并在Autosar系统中配置了SecOC同步报文和同步请求报文。希望以上信息对您有所帮助!

CyberSphinx的博客 649

C语言预处理指令以及Makefile脚本讲解

define宏名常量值本质上就是,在代码中出现了宏名的地方,在预处理时替换为对应的常量值优点提高可扩展性、提高了可读性、提高了安全性,还可以用在case后面注意一般宏名全部大写,末尾不要加分号局部变量、函数名全部小写,全局变量首字母大写数组arr,指针ppp,字符串str预定义好的宏__func__获取函数名__FILE__获取文件名__DATE__获取当前日期__TIME__获取当前时间__LINE__获取当前行数%d。...

weixin_48322392的博客 1084

Android14 Qcom 从Framework到Driver带你连接WIFI(一)

前面已经讲完了WIFI打开的流程,那么通过UI这时候是可以选择需要连接的网络进行连接。从这里开始我们看连接的流程。

IAYLBL的博客 696

C++预处理指令、宏函数、头文件、makefile

C++学习

qq_28507647的博客 265

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

makefile详解(四)

PS:直接从WORD拷贝,未对格式进行仔细整理 5 宏(Macro) 在makefile中可以定义和使用宏。宏的定义的语法是: define 宏名称 宏值 endef 宏的使用方法和变量的使用方法是一样的。另外我们可以使用ifdef预处理指令判断一个宏是否定义。 例1     宏的使用 MKDIR = mkdir CP =cp USRBINDIR=c:/1/2 def

码农刚sama的程序人生 1168

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Makefile入门(四)

Makefile入门(四)

wupeng4389151的博客 1763

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Makefile的使用方法

<br />test.c源码:<br />    #include <stdio.h><br />     void main(void)<br />    {<br />          int sunhao = 9;<br />          #ifdef KT7208<br />                  sunhao = 7208;<br />          #endif<br />          #ifdef KT7216<br />                  sun

aiwoziji13的专栏 597

多文件多子目录makefile

本文为博主个人学习总结记录,如有不正,欢迎指正。

qq_45583706的博客 2079

makefile中defien something的办法

比如有下面这个程序(helloworld.c):>  #include >  int main(){>  #ifdef A>   printf("hello world !");>  #endif>   return 0;>  }这个程序当A被define后,会输出"hello world !",否则do nothing.Makefile如下:>  helloworld:>      gcc he

TodLeigh的专栏 931

Windows Makefile 使用

VS 环境下使用MAKEFILE的工具为NMAKE 注:通常在VS安装目录/VC/BIN 里面,如果在控制台输入此命令无效,可以此路径添加到环境变量PATH里 NMAKE 使用MAKEFILE的语法为 Nmake /f makefile /x stderrfile [macrodefs][targets] 注:makefile 为makefile文件,/xstderrfile为

dengkangyang4的博客 1465

fll makefile备份专用

#include int main(){ #ifdef GAN    printf("ganguofu/n"); #endif  #ifdef FAN    printf("fan/n"); #endif   return 0;}makefile:C++ = g++CCFLAGS = -Wallifndef arc

aaaaatiger--寻路 697

Makefile与宏

预处理指令: C代码不能直接被编译器编译,需要一段程序把它翻译一下,负责翻译的程序叫作预处理器,,翻译的过程叫预处理,被翻译的语句叫预处理指令,以#开头都是预处理指令。 gcc -E code.c 查看预处理结果 gcc -E code.c -o code.i 把预处理的结果保存在文件中。 1、文件包含 #include 把一个头文件导入到当前文件中。 #include <> 从系统指定的路径查找并导入头文件。 #include "" 先从当前路径下查找,

kubassss的博客 629

Windows平台下Makefile学习笔记

转载网址:http://blog.youkuaiyun.com/clever101/article/details/8147352  决心学习Makefile,一方面是为了解决编译开源代码时需要跨编译平台的问题(发现一些开源代码已经在使用VS2010开发,但我还没安装VS2010,我想在VS2008下编译这些代码);另一方面源码在服务器端编译的话,使用IDE的方式编译还是不太方便。

shuaiby的专栏 1931

预处理指令&宏&头文件&makefile

预处理指令、宏、头文件以及makefile的基础知识点

Qqmnz的博客 538

Windows平台下Makefile学习笔记 一

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.youkuaiyun.com/jiangjunshow也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 作者:朱金灿来源:ht

gdruhv的博客 485

Makefile学习笔记(一):Windows平台(转载)

原文链接1:[点击](http://blog.youkuaiyun.com/clever101/article/details/8147352) 原文链接2:[点击](http://blog.youkuaiyun.com/clever101/article/details/8286066) 作者:朱金灿 来源:http://blog.youkuaiyun.com/clever101

微风❤水墨 1800
上一篇: 字符串
下一篇: 结构、联合、枚举
Everglow200
博客等级 码龄6年 12粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值