编译链接专题第4篇-变量和变量的不同赋值方式

admin 2024年2月9日00:29:43评论9 views字数 2340阅读7分48秒阅读模式

前言

很多非科班出身的工程师对项目的编译链接其实是很不熟悉的(包括作者自己),但是如果我们想自己做项目或者从01实现一个项目,或者想要优化程序,或者要修改memory layout,或者要实现AUTOSAR架构下内存保护,编译链接是必不可少的知识。本着打破沙锅学到底的目的,我们决定从01实现一个Windows操作系统下基于AUTOSAR架构的编译环境,同时为了锻炼我们的代码能力,从01实现一个常用的数据结构库,如果有比较优秀的开源AUTOSAR代码也计划加入进去。计划手写整个工程的makefile使用make工具能直接编译工程,同时编写CMakeLists文件,支持CMake生成makefile文件来编译整个工程。

对编译链工具不熟悉的,可以参考这篇文章:https://blog.51cto.com/xiacaojun/5648507

编译链接专题第4篇-变量和变量的不同赋值方式

我们将使用的工具:

项目构建生成工具:CMake

编译链接专题第4篇-变量和变量的不同赋值方式

编译链接专题第4篇-变量和变量的不同赋值方式

项目构建工具:make

编译链接专题第4篇-变量和变量的不同赋值方式

编译链接专题第4篇-变量和变量的不同赋值方式

编译器:

Windosw: gcc/g++

编译链接专题第4篇-变量和变量的不同赋值方式

编译链接专题第4篇-变量和变量的不同赋值方式

编译链接专题第4篇-变量和变量的不同赋值方式

TC3xx: Green Hills (GHS)

关于WindowCMake入门安装请参考这篇文章:Windows下CMake的小白级入门使用教程(hello world)

专题文章:

编译链接专题第1篇-make和makefile介绍

编译链接专题第2篇-初识makefile结构

编译链接专题第3篇-初识makefile中的伪目标

本文目录

编译链接专题第4篇-变量和变量的不同赋值方式

注:本文章引用了一些第三方工具和文档,若有侵权,请联系作者删除!

正文

1.makefile中变量的概念

makefile中支持程序设计语言中变量的概念,makefile中的变量只代表文本数据(字符串),makefile中的变量名规则如下:

-- 变量名可以包含字符,数字,下划线

-- 不能包含 . , # , =

-- 变量名大小写敏感

注意:在C语言里面定义一个变量,必须声明变量的类型,makefile里面定义变量不需要声明类型,因为makefile里面的变量只有一种类型,也就是字符串类型

2.变量的定义和使用

编译链接专题第4篇-变量和变量的不同赋值方式

编程实例:使用变量修改第3篇文章《编译链接专题第3篇-初识makefile中的伪目标》中的makfile代码

#makefileCOMPILER := gccTARGET := hello.exe$(TARGET) : func.o main.o  $(COMPILER) -o hello.exe func.o main.ofunc.o : func.c  $(COMPILER) -o func.o -c func.cmain.o : main.c  $(COMPILER) -o main.o -c main.c.PHONY : rebuild clean allrebuild : clean allall : $(TARGET)  clean :  del *o $(TARGET)

编译链接专题第4篇-变量和变量的不同赋值方式

3.makefile中变量的赋值方式

makefile中变量有以下四种赋值方式:

-- 简单赋值 :=

-- 递归赋值 =

-- 条件赋值 ?=

-- 追加赋值 +=

3.1 简单赋值

简单赋值是程序设计语言中的通用赋值方式,只针对当前语句的变量有效。

编译链接专题第4篇-变量和变量的不同赋值方式

3.2 递归赋值

递归赋值操作可能影响多个其他变量,所有与目标变量相关的其他变量都将受到影响。

编译链接专题第4篇-变量和变量的不同赋值方式

3.3 条件赋值

条件赋值时,如果变量未定义,则使用赋值符号中的值定义变量,如果变量已经定义,赋值无效。

编译链接专题第4篇-变量和变量的不同赋值方式

条件赋值(?=) ,如果当前被赋值的变量已经在前面被定义过了,那么在当前行就不会对它的值做任何的改动,如果是第一次定义这个变量的话,就会将赋值符号右边的值作为初始值赋值给当前变量,所以条件赋值适用于第一次定义变量的使用

3.4 追加赋值

追加赋值时,原变量值之后加上一个新值,原变量值与新值之间由空格隔开。

编译链接专题第4篇-变量和变量的不同赋值方式

追加赋值(+=),给当前的变量追加一个值,当前的变量由于它的类型是字符串类型,所以这个赋值符号就类似于字符串的拼接了

5.编程实验

#makefile variable testx := fooy := $(x)bx := new.PHONY : testtest:  @echo "x => $(x)"  @echo "y => $(y)"

变量简单赋值测试

编译链接专题第4篇-变量和变量的不同赋值方式

x = fooy = $(x)bx = new.PHONY : testtest:@echo "x => $(x)"@echo "y => $(y)"

变量递归赋值测试

编译链接专题第4篇-变量和变量的不同赋值方式

a = $(b)b = $(c)c = hello-makefile.PHONY : testtest:  @echo "x => $(x)"  @echo "y => $(y)"  @echo "a => $(a)"  @echo "b => $(b)"  @echo "c => $(c)"

编译链接专题第4篇-变量和变量的不同赋值方式

makefile里面使用一个变量之前,不需要去定义它,如果使用了一个没有被定义的变量就会得到一个空值。

在写makefile里面尽量不要使用递归赋值。

x := fooy := $(x)bx ?= new.PHONY : testtest:  @echo "x => $(x)"  @echo "y => $(y)"  @echo "a => $(a)"  @echo "b => $(b)"  @echo "c => $(c)"

条件赋值测试

编译链接专题第4篇-变量和变量的不同赋值方式

x := fooy := $(x)bx += new.PHONY : testtest:  @echo "x => $(x)"  @echo "y => $(y)"  @echo "a => $(a)"  @echo "b => $(b)"  @echo "c => $(c)"

追加赋值测试

编译链接专题第4篇-变量和变量的不同赋值方式

6.小结

makefile中支持变量的定义和使用,makefile中存在四种变量的赋值方式。尽量使用简单赋值,如果希望改变当前语句中变量值的时候,其他与当前语句中变量的值相关的变量也发生改变就使用递归赋值,第一次定义变量的时候使用条件赋值。

参考资料:

1.狄泰软件唐老师课程

2.专业嵌入式软件开发书籍

End

原文始发于微信公众号(汽车电子嵌入式):编译链接专题第4篇-变量和变量的不同赋值方式

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年2月9日00:29:43
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   编译链接专题第4篇-变量和变量的不同赋值方式https://cn-sec.com/archives/2481651.html

发表评论

匿名网友 填写信息