c ++ глобальная карта внутри класса, не печатать элементы карты.используя cmake - PullRequest
0 голосов
/ 14 сентября 2018

Я пытаюсь определить глобальную карту в классе a, а затем использовать ее в классе b.хотя карта не пуста, я не мог видеть элементы.

Еще одна проблема, которая беспокоит меня, как я узнаю, что мой код скомпилирован с использованием стандарта c ++ 11?Как я могу установить его для компиляции с C ++ 98 или C ++ 2003?

У меня есть 5 файлов:

  1. map_user_a.h

    #include <map>
    #include <string>
    #include <stdint.h>
    
    using namespace std;
    
    extern std::map<string, uint8_t> map_global;
    
    class map_user_a
    {
        public: 
            void init();
        private:
            int user_a;
    };
    
  2. map_user_a.cpp

    #include <iostream>
    #include "map_user_a.h"
    std::map<string, uint8_t> map_global;
    void map_user_a::init()
    {
        std::cout<<"map_user_a::init()"<<endl;
    
        map_global.insert(std::make_pair("1", 010));
        map_global.insert(std::make_pair("2", 020));
    }
    
  3. map_user_b.h

    #include <map>
    #include <string>
    #include <stdint.h> 
    
    using namespace std;
    
    extern std::map<string, uint8_t> map_global;
    
    class map_user_b
    {
        public:
            void use();
        private:
            int user_b;
    };
    
  4. map_user_b.cpp

    #include <iostream>
    #include "map_user_b.h"
    
    using namespace std;
    
    void map_user_b::use()
    {
        cout<<"map_user_b::use()"<<endl;
        cout<<"global map first pair="<< map_global["1"] <<endl;
    }
    
  5. main.cpp

    #include "map_user_a.h"
    #include "map_user_b.h"
    
    main()
    {
    
        map_user_a map_a;
        map_a.init();
    
        map_user_b map_b;
        map_b.use();
    }
    

Теперь я скомпилировал код под Ubuntu 17.10.1 с помощью cmake.

CMakeLists.txt равен

cmake_minimum_required(VERSION 3.9)

project (stl)

add_executable(stl map_user_a.cpp map_user_a.h map_user_b.cpp map_user_b.h main.cpp)

после вызова cmake ../build (сборка - это мой каталог сборки) Я звоню, чтобы сделать, код скомпилирован без ошибок.

Но мой вывод - первая пара пуста, хотя на карте есть элемент.

map_user_a::init()
map_user_b::use()
global map first pair=

что не так?Спасибо.

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Позвольте мне ответить на ваш второй вопрос. Вы можете добавить следующие операторы в файл CMakeLists.txt, чтобы заставить компилятор использовать стандарт C ++ 11

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -std=c++11")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -std=c++11")

Другие стандартные настройки:

  1. -std = c ++ 98 или -std = c ++ 03 ----- C ++ 98 (C ++ 2003)
  2. -std = c ++ 11 ----- C ++ 11
  3. -std = c ++ 14 ----- C ++ 14
  4. -std = c ++ 17 или -std = c ++ 1z ----- C ++ 17
  5. -std = gnu ++ 98 ----- C ++ 98 и расширения GNU
  6. -std = gnu ++ 11 ----- C ++ 11 и расширения GNU
  7. -std = gnu ++ 14 ----- C ++ 14 и расширения GNU
  8. -std = gnu ++ 1z ----- C ++ 17 и расширения GNU

Что касается стандарта по умолчанию, то это зависит от того, какой компилятор вы используете, и от версии компилятора. Я думаю, что для пояснения стандарта C ++ лучше использовать вышеуказанный метод.

Вы можете использовать следующую инструкцию в CMakeLists.txt, чтобы протестировать стандарты, поддерживаемые компилятором, и настроить его.

include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
CHECK_CXX_COMPILER_FLAG("-std=c++14" COMPILER_SUPPORTS_CXX14)
CHECK_CXX_COMPILER_FLAG("-std=c++17" COMPILER_SUPPORTS_CXX17)
if(COMPILER_SUPPORTS_CXX17)
    message(STATUS "support c++17")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17")
elseif(COMPILER_SUPPORTS_CXX14)
    message(STATUS "support c++14")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14")
elseif(COMPILER_SUPPORTS_CXX11)
    message(STATUS "support c++11")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
endif()
0 голосов
/ 14 сентября 2018

std::uint8_t, скорее всего, typedef для unsigned char. И когда вы предоставляете char, unsigned char или signed char для std::ostream, он обрабатывает его не как число, а как символ. Таким образом, ваша программа печатает не восьмеричное число 010 / десятичное 8, а символ с этим числом в качестве кода. Предполагая, что ваш набор символов является некоторым расширением ASCII, это непечатный символ «backspace», поэтому ваш терминал, вероятно, просто игнорирует его.

Чтобы напечатать std::uint8_t как число, добавьте явное приведение к unsigned int:

cout << "global map first pair=" << static_cast<unsigned int>(map_global["1"]) << endl;
...