IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> CMake | 使用宏重用代码 -> 正文阅读

[C++知识库]CMake | 使用宏重用代码

目录

一、CMake相关命令

1.macro

2.与宏参数相关的字符串

(1)${ARGC}

(2)${ARGV}

(3)${ARGN}

3.math

4.add_test

5.set_tests_properties

二、主要实现

1.顶层CMakeLists.txt

2.tests/CMakeLists.txt?

3.tests/test.cpp

4.其他文件

5.配置及编译

????????在测试时,通过宏可以方便地定义测试和设置测试的顺序。比如我们测试代码时需要多次调用调用?add_test 和 set_tests_properties来设置每个测试的预期开销,而我们通过定义一个宏(或一个函数)能够一次性处理这两个函数的调用。

一、CMake相关命令

1.macro

macro(<name> [<arg1> ...])
  <commands>
endmacro()

????????定义一个名为<name>的宏,该宏接受名为<arg1>的参数。在调用宏之前,不会执行macro()到endmacro()之间列出的命令。

2.与宏参数相关的字符串

(1)${ARGC}

????????保存给定宏的所有参数数量。

(2)${ARGV}

????????保存给定宏的所有参数列表。

(3)${ARGN}

????????保存超过最后一个预期参数的参数列表,即额外参数列表。

????????宏命令与function()命令非常相似。尽管如此,还是有一些重要的区别:

  • 在函数中,ARGN,ARGC,ARGV和ARGV0,ARGV1...是通常意义上的真变量。
  • 在宏上,它们不是变量它们是字符串替换,就像C预处理器对宏所做的那样。

????????所以,无法使用以下命令:

if(ARGV1)

????????而我们应该这样使用:

if(${ARGV1})

3.math

math(EXPR <variable> "<expression>" [OUTPUT_FORMAT <format>])

????????计算一个数学表达式。计算数学表达式<expression>,并将<variable>设置为结果值。表达式的结果必须可以表示为64位有符号整数。

  1. 数学表达式必须以字符串形式给出(即用双引号括起来)。
  2. 结果根据选项OUTPUT_FORMAT格式化,其中<format>是以下选项之一:
  • HEXADECIMAL:C代码中的十六进制表示法,即以“0x”开头。
  • DECIMAL:十进制记数法。如果未指定“输出格式”选项,也会使用该选项。
  math(EXPR num_macro_calls "${num_macro_calls} + 1")

4.add_test

????????CMake I 创建一个简单的单元测试_该用户还没想到好的昵称的博客-CSDN博客

5.set_tests_properties

set_tests_properties(test1 [test2...] PROPERTIES prop1 value1 prop2 value2)

????????设置测试的属性。如果未找到测试,CMake将报告错误。

????????COST属性:描述测试的成本。当启用并行测试时,测试集中的测试将按成本降序运行。项目可以通过将此属性设置为浮点值来明确定义测试的成本。

二、主要实现

1.顶层CMakeLists.txt

cmake_minimum_required(VERSION 3.5 FATAL_ERROR)

project(recipe-01 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

#根据GNU标准定义 binary 和 library 路径
include(GNUInstallDirs)

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR})

#使用 add_subdirectory 调用 src/CMakeLists.txt 和 tests/CMakeLists.txt 
add_subdirectory(src)

enable_testing()
add_subdirectory(tests)

2.tests/CMakeLists.txt?

#构建并链接 cpp_test 可执行文件
add_executable(cpp_test test.cpp)
target_link_libraries(cpp_test sum_integers)

#定义一个新宏 add_catch_test,两个参数_name _cost
macro(add_catch_test _name _cost)

  #将 num_macro_calls 加1
  math(EXPR num_macro_calls "${num_macro_calls} + 1")
  
  message(STATUS "add_catch_test called with ${ARGC} arguments: ${ARGV}")

  #引入一个新变量,但不能直接查询ARGN,因为它不是通常意义上的CMake变量
  set(_argn "${ARGN}")

  if(_argn)
    message(STATUS "oops - macro received argument(s) we did not expect: ${ARGN}")
  endif()

  add_test(
    NAME
      ${_name}
    COMMAND
      $<TARGET_FILE:cpp_test>
      [${_name}] --success --out
      ${PROJECT_BINARY_DIR}/tests/${_name}.log --durations yes
    WORKING_DIRECTORY
      ${CMAKE_CURRENT_BINARY_DIR}
    )

  set_tests_properties(
    ${_name}
    PROPERTIES
      COST ${_cost}
    )
endmacro()

set(num_macro_calls 0)
#使用 add_catch_test 定义了两个测试
add_catch_test(short 1.5)
add_catch_test(long 2.5 extra_argument)

message(STATUS "in total there were ${num_macro_calls} calls to add_catch_test")

????????add_test中的命令可以参考:CMake I 使用Catch2库进行单元测试_该用户还没想到好的昵称的博客-CSDN博客?

3.tests/test.cpp

#include "sum_integers.hpp"

// this tells catch to provide a main()
// only do this in one cpp file
#define CATCH_CONFIG_MAIN
#include "catch.hpp"

#include <vector>

TEST_CASE("Sum of integers for a short vector", "[short]") {
  auto integers = {1, 2, 3, 4, 5};
  REQUIRE(sum_integers(integers) == 15);
}

TEST_CASE("Sum of integers for a longer vector", "[long]") {
  std::vector<int> integers;
  for (int i = 1; i < 1001; ++i) {
    integers.push_back(i);
  }
  REQUIRE(sum_integers(integers) == 500500);
}

4.其他文件

????????src/sum_integers.h文件和 src/sum_integers.cpp文件见博客

????????tests/catch.hpp文件见博客

5.配置及编译

?????????进行测试时,时间长的会先开始。ctest命令见博客

?

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-06 12:43:52  更:2022-03-06 12:44:28 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 5:53:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码