C++ c++;类中的全局映射,不打印映射元素。使用cmake
我试图在类a中定义一个全局映射,然后在类b中使用它。 虽然地图不是空的,但我看不到元素 另一个困扰我的问题是,我如何知道我的代码是否使用c++11标准编译? 我如何设置它,用c++98或c++2003编译 我有5个文件:C++ c++;类中的全局映射,不打印映射元素。使用cmake,c++,c++11,stdmap,c++03,C++,C++11,Stdmap,C++03,我试图在类a中定义一个全局映射,然后在类b中使用它。 虽然地图不是空的,但我看不到元素 另一个困扰我的问题是,我如何知道我的代码是否使用c++11标准编译? 我如何设置它,用c++98或c++2003编译 我有5个文件: 映射用户 #include <map> #include <string> #include <stdint.h> using namespace std; extern std::map<string, uint8_t> m
#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;
};
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(build是我的build目录)之后,我调用make,代码编译没有错误
但是我的输出是第一对空的,尽管map有元素
map_user_a::init()
map_user_b::use()
global map first pair=
怎么了?
谢谢。
std::uint8\u t
很可能是无符号字符的typedef。当您向std::ostream
提供char
、unsigned char
或signed char
时,它不会将其视为数字,而是将其视为字符。因此,您的程序打印的不是数字八进制010
/decimal8
,而是以该数字作为其代码的字符。假设您的字符集是ASCII的扩展,这是不可打印的字符“backspace”,因此您的终端可能会忽略它
要将std::uint8\u t
打印为数字,请向unsigned int
添加显式强制转换:
cout << "global map first pair=" << static_cast<unsigned int>(map_global["1"]) << endl;
让我回答你的第二个问题。您可以将以下语句添加到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")
其他标准设置如下所示:
-std=c++98,或-std=c++03---c++98(c++2003)
-std=c++11-----c++11
-std=c++14---c++14
-std=c++17或-std=c++1z-----c++17
-std=gnu++98---C++98和gnu扩展
-std=gnu++11---C++11和gnu扩展
-std=gnu++14---C++14和gnu扩展
-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()
请避免在同一个SO问题中提出不相关的问题。但是,您可能对在CMASE中设置C++语言版本的问答感兴趣:从任何函数中省略返回类型是无效的:<代码>主()/<代码>应该是代码> int()/<代码>。使用名称空间std编写代码>在全局范围内,尤其是在头文件中,被认为是有害的:请参阅不相关。。。我的makefile生成以下命令:g++-O3-ggdb-std=c++17-Wall-Wextra-Wshadow-Wnon virtual dtor-pedantic-Werror=vla-Wcast align-Wcast qual-Wconversion-Wpointer arith-Wunused-Wold-style cast-Woverloaded virtual-MMD-MP-O0.././bag/src/dtb_assert.o GameOfLife.cc-o GameOfLife-lncurses-pthread您可以添加一些方法吗强制编译器使用C++98和C++2003标准?此外,我如何知道我编写的代码的默认或当前标准是什么。我希望能帮上忙
map_user_a::init()
map_user_b::use()
global map first pair=
cout << "global map first pair=" << static_cast<unsigned int>(map_global["1"]) << endl;
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")
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()