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

Makefile学习5 - call和eval函数

一. 前言

        call函数是一个可以定制化函数参数的引用函数,使用这个函数可以实现对用户自定义函数的引用。也可以将一个变量定义为一个复杂的表达式,用call函数根据不同的参数对他进行展开获得不同的结果。

        eval对它的参数进行展开,展开的结果作为Makefile的一部分,eval函数根据其参数的关系,结构,对它们进行替换展开。

二. call和eval函数的区别

        call函数只是根据不同的参数对表达式进行展开,并不执行表达式,其中变量值还是原来的值。eval函数也是对表达式进行展开,但是会对其中的变量值进行替换,其中的变量值会被重新赋值。举例如下:

call函数

define test
foo:=$(1)
endef

$(warning $(call test,apple))

all:
        @echo foo=$(foo).

结果:
test1.mk:8: foo:=apple
foo=.

        从中可以看出,调用call函数已经生成了表达式foo:=apple,但是此时表达式还未运行,foo变量的值还并不是apple。

eval函数

define test
foo:=$(1)
endef

$(warning $(eval $(call test,apple)))

all:
        @echo foo=$(foo).

结果:
test2.mk:7: 
foo=apple.

        本例与上例的区别是在call的基础上多调用了eval函数,从结果中可以看出,变量foo的值已经是apple了。说明执行eval后,test函数已经执行了,其中的变量的值也做了相应的替换。

三. 总结

        call函数的作用是能够函数的参数,并将函数内的表达式和变量进行展开,但是表达式和变量的值并不会发生改变,只是做了纯粹的展开而已。eval函数则不止对函数的表达式和变量展开,而且会将表达式和变量作相应的替换,变量的值会改变。


http://www.kler.cn/a/7675.html

相关文章:

  • 数据分析-48-时间序列变点检测之在线实时数据的CPD
  • 基于VUE实现语音通话:边录边转发送语言消息、 播放pcm 音频
  • 跟我学C++中级篇——Design Patterns的通俗说法
  • gitHub常用操作
  • 深入探索 TypeScript:从基础到高级特性
  • Java 包装类
  • AIGC技术周报|ChatDoctor:哪里不舒服;HuggingGPT:连接大模型和机器学习社区;ChatGPT真的鲁棒吗?
  • 双周赛101(模拟、动态规划、中位数贪心+裴蜀定理、BFS)
  • 042:cesium加载Eris地图(多种形式)
  • linux虚拟机关机、重启命令
  • C++之继承
  • ctfshow web入门 命令执行web54-58
  • 【LeetCode】剑指 Offer 44. 数字序列中某一位的数字 p225 -- Java Version
  • 【图像分类】卷积神经网络之VGG网络模型结构详解
  • Atlassian Server用户新选择 | 迁移到数据中心版前,您需要做这些准备(2)
  • Java中String类型的创建关系、什么是常量池、以及StringBuilder/Buffer等
  • leetcode:验证回文串(详解)
  • 【音视频】zlmediakit总结二---webrtc编译
  • 【06】卷积
  • Spring Security 权限控制
  • mysql数据库简介
  • UE4 Sequence学习
  • 微软新Bing AI,带chat聊天写作等功能的搜索引擎简介
  • Nodejs+vue+elementui网上租车网站 vscode汽车租赁系统
  • 【MATLAB】一篇文章带你了解beatxbx工具箱使用
  • Zookeeper