gpt4 book ai didi

我们可以在模板源文件中使用 CMake foreach 吗?

转载 作者:行者123 更新时间:2023-12-02 07:48:39 27 4
gpt4 key购买 nike

为了对我的函数进行单元测试,我自动生成了名称,如下所示:

测试内爆测试范围

进入 CMake 变量。

我想在C中自动调用all。我还在 CMake 中使用了配置文件 (.in.c)

set(CONFIG configuration)
configure_file(${CONFIG}.in.c ${CONFIG}.c)
set(CONFIG_SRC ${CMAKE_CURRENT_BINARY_DIR}/${CONFIG}.c)

但是函数名只是在 CMake 的 List 中,C 语法无效。我可以使用适当的语法在 CMake 中生成一个变量,但在配置文件中生成输出将使 CMake 源文件变得干净,并且可能非常强大。

具体来说,我想做的是(想象的语法):

#include "tests.h"

void all_tests() {

void(*tests)()[] = {
@FOREACH(FUNC FUNCTIONS)@
test_@FUNC@,
@ENDFOREACH()@
NULL
};

void(*test_function)() = tests[0];

while(test_function) {
test_function();
test_function++;
}
}

与blade或php类似。我可以使用 CMake 作为脚本语言(或 foreach),还是必须将其放入 CMake 源文件并将其存储到变量中?

我目前所做的,是可以接受的,有效的。但我正在学习,我想知道它是否仍然可能

foreach(PHP_FUNCTION ${PHP_FUNCTIONS})
list(APPEND GENERATED_C_CODE_RUN_TEST "\n\ttest_${PHP_FUNCTION}()")
endforeach()

set(GENERATED_C_CODE_RUN_TEST "${GENERATED_C_CODE_RUN_TEST};")
set(CONFIG configuration)
configure_file(${CONFIG}.in.c ${CONFIG}.c)
set(CONFIG_SRC ${CMAKE_CURRENT_BINARY_DIR}/${CONFIG}.c)
add_executable(...);
#include "tests.h"

void all_tests() {

@GENERATED_C_CODE_RUN_TEST@
}

最佳答案

一种解决方案是将 test_ 前缀附加到列表中的每个测试名称,然后使用 list(JOIN ...)构造一个表示逗号分隔列表的字符串(这是有效的 C 语法)。

list(APPEND PHP_FUNCTIONS
func1
func2
func3
)

# Append the 'test_' prefix to each test function name.
foreach(PHP_FUNCTION ${PHP_FUNCTIONS})
list(APPEND FUNCTION_NAMES_LIST "test_${PHP_FUNCTION}")
endforeach()
message(STATUS "FUNCTION_NAMES_LIST: ${FUNCTION_NAMES_LIST}")

# Construct a comma-separated string from the list.
list(JOIN FUNCTION_NAMES_LIST "," FUNCTION_NAMES_STRING)
message(STATUS "FUNCTION_NAMES_STRING: ${FUNCTION_NAMES_STRING}")

这将打印以下内容:

FUNCTION_NAMES_LIST: test_func1;test_func2;test_func3
FUNCTION_NAMES_STRING: test_func1,test_func2,test_func3

然后,您可以修改 configuration.in.c 文件,这样只需替换一个变量:

void all_tests() {

void(*tests)()[] = {
@FUNCTION_NAMES_STRING@,
NULL
};

void(*test_function)() = tests[0];

while(test_function) {
test_function();
test_function++;
}
}

您可以使用“粘合”或分隔符字符串来将 CMake 列表连接在一起。在我的示例中,我使用了 "," 但您可以使用 ", "",\n\t" 来生成结果 C代码更美观。 CMake list() (和 string() )有很多操作选项可供使用,所以我鼓励您检查它们。

关于我们可以在模板源文件中使用 CMake foreach 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57829274/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com