<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 7.4 用指定參數定義函數或宏 **NOTE**:*此示例代碼可以在 https://github.com/dev-cafe/cmake-cookbook/tree/v1.0/chapter-7/recipe-04 中找到,其中包含一個C++示例。該示例在CMake 3.5版(或更高版本)中是有效的,并且已經在GNU/Linux、macOS和Windows上進行過測試。* 前面的示例中,我們研究了函數和宏,并使用了位置參數。這個示例中,我們將定義一個帶有命名參數的函數。我們將復用第1節中的示例,使用函數和宏重用代碼,而不是使用以下代碼定義測試:`add_catch_test(short 1.5)`。 我們將這樣調用函數: ```cmake add_catch_test( NAME short LABELS short cpp_test COST 1.5 ) ``` ## 準備工作 我們使用第1節中的示例,使用函數和宏重用代碼,并保持C++源代碼不變,文件樹保持不變: ```shell . ├── cmake │ └── testing.cmake ├── CMakeLists.txt ├── src │ ├── CMakeLists.txt │ ├── main.cpp │ ├── sum_integers.cpp │ └── sum_integers.hpp └── tests ├── catch.hpp ├── CMakeLists.txt └── test.cpp ``` ## 具體實施 我們對CMake代碼進行一些修改,如下所示: 1. `CMakeLists.txt`頂部中只增加了一行,因為我們將包括位于`cmake`下面的模塊: ```cmake list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") ``` 2. 保持`src/CMakeLists.txt`。 3. `tests/CMakeLists.txt`中,將`add_catch_test`函數定義移動到`cmake/testing.cmake`,并且定義兩個測試: ```cmake add_executable(cpp_test test.cpp) target_link_libraries(cpp_test sum_integers) include(testing) add_catch_test( NAME short LABELS short cpp_test COST 1.5 ) add_catch_test( NAME long LABELS long cpp_test COST 2.5 ) ``` 4. `add_catch_test`在`cmake/testing.cmake`中定義: ```cmake function(add_catch_test) set(options) set(oneValueArgs NAME COST) set(multiValueArgs LABELS DEPENDS REFERENCE_FILES) cmake_parse_arguments(add_catch_test "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} ) message(STATUS "defining a test ...") message(STATUS " NAME: ${add_catch_test_NAME}") message(STATUS " LABELS: ${add_catch_test_LABELS}") message(STATUS " COST: ${add_catch_test_COST}") message(STATUS " REFERENCE_FILES: ${add_catch_test_REFERENCE_FILES}") add_test( NAME ${add_catch_test_NAME} COMMAND $<TARGET_FILE:cpp_test> [${add_catch_test_NAME}] --success --out ${PROJECT_BINARY_DIR}/tests/${add_catch_test_NAME}.log --durations yes WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} ) set_tests_properties(${add_catch_test_NAME} PROPERTIES LABELS "${add_catch_test_LABELS}" ) if(add_catch_test_COST) set_tests_properties(${add_catch_test_NAME} PROPERTIES COST ${add_catch_test_COST} ) endif() if(add_catch_test_DEPENDS) set_tests_properties(${add_catch_test_NAME} PROPERTIES DEPENDS ${add_catch_test_DEPENDS} ) endif() if(add_catch_test_REFERENCE_FILES) file( COPY ${add_catch_test_REFERENCE_FILES} DESTINATION ${CMAKE_CURRENT_BINARY_DIR} ) endif() endfunction() ``` 5. 測試輸出: ```cmake $ mkdir -p build $ cd build $ cmake .. -- ... -- defining a test ... -- NAME: short -- LABELS: short;cpp_test -- COST: 1.5 -- REFERENCE_FILES: -- defining a test ... -- NAME: long -- LABELS: long;cpp_test -- COST: 2.5 -- REFERENCE_FILES: -- ... ``` 6. 最后,編譯并測試: ```shell $ cmake --build . $ ctest ``` ## 工作原理 示例的特點是其命名參數,因此我們可以將重點放在`cmake/testing.cmake`模塊上。CMake提供`cmake_parse_arguments`命令,我們使用函數名(`add_catch_test`)選項(我們的例子中是`none`)、單值參數(`NAME`和`COST`)和多值參數(`LABELS`、`DEPENDS`和`REFERENCE_FILES`)調用該命令: ```cmake function(add_catch_test) set(options) set(oneValueArgs NAME COST) set(multiValueArgs LABELS DEPENDS REFERENCE_FILES) cmake_parse_arguments(add_catch_test "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} ) ... endfunction() ``` `cmake_parse_arguments`命令解析選項和參數,并在例子中定義如下: * add_catch_test_NAME * add_catch_test_COST * add_catch_test_LABELS * add_catch_test_DEPENDS * add_catch_test_REFERENCE_FILES 可以查詢,并在函數中使用這些變量。這種方法使我們有機會用更健壯的接口和更具有可讀的函數/宏調用,來實現函數和宏。 ## 更多信息 選項關鍵字(本例中我們沒有使用)由`cmake_parse_arguments`定義為`TRUE`或`FALSE`。`add_catch_test`函數,還提供`test`命令作為一個命名參數,為了更簡潔的演示,我們省略了這個參數。 **TIPS**:*`cmake_parse_arguments`命令在cmake 3.5的版本前中的`CMakeParseArguments.cmake`定義。因此,可以在`CMake/test.cmake`頂部的使用`include(CMakeParseArguments)`命令使此示例能與CMake早期版本一起工作。*
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看