CMake是否支持宏或函数重载?多参数宏调用报错该如何处理?
CMake宏重载失效问题及解决方法
尝试实现的宏定义
macro(OVERLOAD_TEST par1 par2) message ("Macro with two arguments") endmacro() macro(OVERLOAD_TEST par1 par2 par3) message ("Macro with three arguments") endmacro()
宏调用代码
OVERLOAD_TEST("A" "B" "C") OVERLOAD_TEST("A" "B")
报错信息
Macro with three arguments
CMake Error at CMakeLists.txt:59 (OVERLOAD_TEST):
OVERLOAD_TEST Macro invoked with incorrect arguments for macro named:
OVERLOAD_TEST
CMake不支持宏或函数的重载,你定义的第二个OVERLOAD_TEST宏会直接覆盖第一个。调用两个参数的版本时,实际匹配的是要求三个参数的宏,因此触发参数错误。
你应该改用CMake的可选参数特性,只定义一个宏来处理不同参数数量的情况。以下是两种实现方式:
方式1:通过ARGV变量判断参数数量
macro(OVERLOAD_TEST par1 par2) # 检查是否存在第三个可选参数 if(ARGV2) message("Macro with three arguments: ${par1}, ${par2}, ${ARGV2}") else() message("Macro with two arguments: ${par1}, ${par2}") endif() endmacro()
调用示例:
OVERLOAD_TEST("A" "B" "C") # 输出 Macro with three arguments: "A", "B", "C" OVERLOAD_TEST("A" "B") # 输出 Macro with two arguments: "A", "B"
方式2:用cmake_parse_arguments规范处理(适合复杂场景)
include(CMakeParseArguments) macro(OVERLOAD_TEST) cmake_parse_arguments(ARG "" "" "" ${ARGN}) list(LENGTH ARGN arg_count) if(arg_count EQUAL 3) message("Macro with three arguments: ${ARGN}") elseif(arg_count EQUAL 2) message("Macro with two arguments: ${ARGN}") else() message(FATAL_ERROR "OVERLOAD_TEST requires 2 or 3 arguments") endif() endmacro()
内容的提问来源于stack exchange,提问作者Vikash
相关产品推荐
相关产品推荐

