函数"/>
qmake language defined(name[, type])函数
defined(name[, type])是qmake中的Build-in test function,其意义是用于判断name是否已经被定义了,可以判断qmake中的变量名、自定义repace函数名、自定义test函数名是否已经被定义。
关于qmake自定义函数可以参考:qmake自定义函数_Qt君的博客-CSDN博客_qmake 自定义函数
实际操作大致与文档介绍相同,只是对build-in function进行测试时是无法检测出来的。
type参数有test、replace、var三个可选项。如果没有type参数,检测是否是自定义的test函数或replace函数;如果使用test参数,则检测是否是自定义的test函数;如果使用replace参数则检测是否是自定义的replace函数;如果使用var参数,则检测是否是变量,包括内部定义的CONFIG、TEMPLATE等变量。
Tests whether the function or variable name is defined. If type is omitted, checks all functions. To check only variables or particular type of functions, specify type. It can have the following values:
- test only checks test functions
- replace only checks replace functions
- var only checks variables
tt=true
ttv=123
tt1= #定义空变量message($$tt) #输出true
message($$ttv) #输出123defineTest(mytt){ #自定义函数mytt,传入参数个数是没有限制的,使用哪些个参数是内部的事情message($$ARGS)var=$$1 #$${1} 与 $$1等价varvalue=$$eval($${1}) #获取变量的值需要双重$$,需要通过eval 这个replace函数来获取message(--{1}=$${1})message(--var=$$var)message(--varvalue=$$varvalue)
}mytt(ttv) #注意defineTest函数传入的参数是ttv这个变量名
#输出:
#ttv
#--{1}=ttv
#--var=ttv
#--varvalue=123
mytt(ttv,tt1) #mytt中只使用第一个参数,再多的参数虽然合法但是没有意义。
#输出:
#ttv tt1
#--{1}=ttv
#--var=ttv
#--varvalue=123defineReplace(myfunc) {variable = $$ARGSnames = $$eval($$variable)tname = $$1message($$ARGS)for(name, variable) {equals(name,33):tname=$$name}return($$tname)
}defineTest(allFiles) {files = $$ARGSfor(file, files) {!exists($$file) {return(false)}}return(true)
}VAR=defined(CONFIG,var){message(here1) //输出
}else{message(here2)
}defined(allFiles){message(here3) //输出
}else{message(here4)
}
defined(allFiles,test){message(here5) //输出
}else{message(here6)
}
defined(allFiles,replace){message(here7)
}else{message(here8) //输出
}
defined(myfunc){message(here9) //输出
}else{message(here10)
}
defined(myfunc,test){message(here11)
}else{message(here12) //输出
}
defined(myfunc,replace){message(here13) //输出
}else{message(here14)
}
defined(load){message(here15)
}else{message(here16) //输出
}
defined(VAR){message(here17)
}else{message(here18) //输出
}
defined(VAR,var){message(here19) //输出
}else{message(here20)
}
杂谈
//E:\workspace\QtWork\qmake\library\qmakebuiltins.cpp
QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinConditional(const QMakeInternal::QMakeBuiltin &adef, const ProKey &function, const ProStringList &args)
{
m_functionDefs.testFunctions存放自定义的test函数,内置的test函数存放在static.functions中
m_functionDefs.replaceFunctions存放自定义的replace函数,内置的replace函数存放在static.expands中。defined并没有对内置函数进行查找。
........case T_DEFINED: { const ProKey &var = args.at(0).toKey();if (args.count() > 1) {if (args[1] == QLatin1String("test")) {return returnBool(m_functionDefs.testFunctions.contains(var));} else if (args[1] == QLatin1String("replace")) {return returnBool(m_functionDefs.replaceFunctions.contains(var));} else if (args[1] == QLatin1String("var")) {ProValueMap::Iterator it;return returnBool(findValues(var, &it));}evalError(fL1S("defined(function, type): unexpected type [%1].").arg(args.at(1).toQStringView()));return ReturnFalse;}return returnBool(m_functionDefs.replaceFunctions.contains(var)|| m_functionDefs.testFunctions.contains(var));}
......
qmake eval(string) 函数_丘上人的博客-CSDN博客
qmake language defineTest(testfunctionname) defineReplace(repacefunctionname) 自定义函数_丘上人的博客-CSDN博客
更多推荐
qmake language defined(name[, type])函数
发布评论