Yaml-cpp 配置解析器测试 CppUTest 问题 "expected type-specifier before ‘(’ token"
Yaml-cpp configuration parser testing with CppUTest issue "expected type-specifier before ‘(’ token"
我正在使用 yaml-cpp 库 (v 0.6.0) 来解析 yaml 配置文件。 Yaml-cpp 作为系统库安装。
我做了一个 class Parser
来检查 yaml 节点中的 key-value 对。 Parser
class 构建为 ConfigParserLibrary
静态库。
现在我想使用 CppUTest
测试 Parser
class。使用 CMake
构建项目。示例代码:
CMakeLists:
cmake_minimum_required(VERSION 3.9)
project(yaml-parser VERSION 0.1.0)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# ConfigParserLibrary lib
include_directories(${PROJECT_SOURCE_DIR}/include/config_parser_lib)
file(GLOB_RECURSE LIB_CONFIG_PARSER_SRC "config_parser_lib/Parser.cpp")
add_library(ConfigParserLibrary STATIC ${LIB_CONFIG_PARSER_SRC})
target_link_libraries(ConfigParserLibrary yaml-cpp)
# Executable that uses ConfigParserLibrary
add_executable(conf_reader "config_reader.cpp")
target_link_libraries(conf_reader yaml-cpp ConfigParserLibrary)
message(STATUS "Library tests will be built.")
add_library(ConfigParserTests STATIC tests/ConfigParserTests.cpp)
target_link_libraries(ConfigParserTests ConfigParserLibrary yaml-cpp)
add_executable(RunLibTests tests/RunTests.cpp)
target_link_libraries(RunLibTests CppUTest CppUTestExt
ConfigParserTests ConfigParserLibrary yaml-cpp)
add_test(NAME test_library COMMAND RunLibTests)
当我在另一个可执行文件中使用解析器 class 时,它编译没有错误。但是当我在 ConfigParserTests.cpp 文件中包含 config_parser_lib/Parser.hpp 文件时,它会引发:/usr/include/c++/8/optional:208: error: expected type-specifier before ‘(’ token
::new ((void *) std::__addressof(this->_M_payload))
^
。
Parser.hpp
#pragma once
#include <yaml-cpp/yaml.h>
class Parser{
public:
int parseNode(YAML::Node configNode);
};
Parser.cpp
#include "config_parser_lib/Parser.hpp"
int Parser::parseNode(YAML::Node configNode){
return valueA = configNode["keyA"].as<int>();
}
ConfigParserTests.cpp
#include <CppUTest/TestHarness.h>
#include "config_parser_lib/Parser.hpp"
TEST_GROUP(ConfigParserTests) {
};
TEST(ConfigParserTests, ParseConfigNode){
}
RunTests.cpp
#include <CppUTest/CommandLineTestRunner.h>
IMPORT_TEST_GROUP(ConfigParserTests);
int main(int ac, const char** av)
{
return CommandLineTestRunner::RunAllTests(ac, av);
}
在 CMakeLists.txt
中:当我将 CMAKE_CXX_STANDARD
从 17 更改为 11 时,出现以下错误 /usr/include/c++/8/bits/stl_tree.h:636: error: ‘__node’ does not name a type
::new(__node) _Rb_tree_node<_Val>;
^~~~~~
。
如果我在ConfigParserTests.cpp
中注释掉#include "config_parser_lib/Parser.hpp"
行,就没有错误。因此我认为错误来自包含 <yaml-cpp/yaml.h>
文件。如果我包含 <yaml-cpp/node/node.h>
而不是 yaml.h>
,则没有错误,但我需要 <yaml-cpp/yaml.h>
文件,其中包含我需要使用的其他 headers。
gcc 版本 8.3.1 20190226.
更改 ConfigParserTests.cpp
中的包含顺序解决了问题。
#include "config_parser_lib/Parser.hpp"
#include <CppUTest/TestHarness.h>
我假设 #include <yaml-cpp/yaml.h>
应该在每个翻译单元的开头。
我正在使用 yaml-cpp 库 (v 0.6.0) 来解析 yaml 配置文件。 Yaml-cpp 作为系统库安装。
我做了一个 class Parser
来检查 yaml 节点中的 key-value 对。 Parser
class 构建为 ConfigParserLibrary
静态库。
现在我想使用 CppUTest
测试 Parser
class。使用 CMake
构建项目。示例代码:
CMakeLists:
cmake_minimum_required(VERSION 3.9)
project(yaml-parser VERSION 0.1.0)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# ConfigParserLibrary lib
include_directories(${PROJECT_SOURCE_DIR}/include/config_parser_lib)
file(GLOB_RECURSE LIB_CONFIG_PARSER_SRC "config_parser_lib/Parser.cpp")
add_library(ConfigParserLibrary STATIC ${LIB_CONFIG_PARSER_SRC})
target_link_libraries(ConfigParserLibrary yaml-cpp)
# Executable that uses ConfigParserLibrary
add_executable(conf_reader "config_reader.cpp")
target_link_libraries(conf_reader yaml-cpp ConfigParserLibrary)
message(STATUS "Library tests will be built.")
add_library(ConfigParserTests STATIC tests/ConfigParserTests.cpp)
target_link_libraries(ConfigParserTests ConfigParserLibrary yaml-cpp)
add_executable(RunLibTests tests/RunTests.cpp)
target_link_libraries(RunLibTests CppUTest CppUTestExt
ConfigParserTests ConfigParserLibrary yaml-cpp)
add_test(NAME test_library COMMAND RunLibTests)
当我在另一个可执行文件中使用解析器 class 时,它编译没有错误。但是当我在 ConfigParserTests.cpp 文件中包含 config_parser_lib/Parser.hpp 文件时,它会引发:/usr/include/c++/8/optional:208: error: expected type-specifier before ‘(’ token
::new ((void *) std::__addressof(this->_M_payload))
^
。
#pragma once
#include <yaml-cpp/yaml.h>
class Parser{
public:
int parseNode(YAML::Node configNode);
};
Parser.cpp
#include "config_parser_lib/Parser.hpp"
int Parser::parseNode(YAML::Node configNode){
return valueA = configNode["keyA"].as<int>();
}
ConfigParserTests.cpp
#include <CppUTest/TestHarness.h>
#include "config_parser_lib/Parser.hpp"
TEST_GROUP(ConfigParserTests) {
};
TEST(ConfigParserTests, ParseConfigNode){
}
RunTests.cpp
#include <CppUTest/CommandLineTestRunner.h>
IMPORT_TEST_GROUP(ConfigParserTests);
int main(int ac, const char** av)
{
return CommandLineTestRunner::RunAllTests(ac, av);
}
在 CMakeLists.txt
中:当我将 CMAKE_CXX_STANDARD
从 17 更改为 11 时,出现以下错误 /usr/include/c++/8/bits/stl_tree.h:636: error: ‘__node’ does not name a type
::new(__node) _Rb_tree_node<_Val>;
^~~~~~
。
如果我在ConfigParserTests.cpp
中注释掉#include "config_parser_lib/Parser.hpp"
行,就没有错误。因此我认为错误来自包含 <yaml-cpp/yaml.h>
文件。如果我包含 <yaml-cpp/node/node.h>
而不是 yaml.h>
,则没有错误,但我需要 <yaml-cpp/yaml.h>
文件,其中包含我需要使用的其他 headers。
gcc 版本 8.3.1 20190226.
更改 ConfigParserTests.cpp
中的包含顺序解决了问题。
#include "config_parser_lib/Parser.hpp"
#include <CppUTest/TestHarness.h>
我假设 #include <yaml-cpp/yaml.h>
应该在每个翻译单元的开头。