加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 创业 > 正文

C++调试记录与心得分享

发布时间:2021-01-10 08:10:58 所属栏目:创业 来源:网络整理
导读:之前开拓用Linux C较量多,C++中的STL 容器根基没有打仗过。最近在进修C++,平常用到c++ 17中的部门新特征,下面就简朴分享下本身C++的进修流程。 一、情形搭建 本人行使的是CentOS 7体系,该体系默认的g++版本不支持c++17的新特征。以是,起首必要做的就是
副问题[/!--empirenews.page--]

 之前开拓用Linux C较量多,C++中的STL 容器根基没有打仗过。最近在进修C++,平常用到c++ 17中的部门新特征,下面就简朴分享下本身C++的进修流程。

一、情形搭建

     本人行使的是CentOS 7体系,该体系默认的g++版本不支持c++17的新特征。以是,起首必要做的就是进级新版本的g++。
1.到ftp://ftp.mirrorservice.org/sites/sourceware.org/pub/gcc/releases/网站上选择支持c++17的gcc版本,并行使wget下载到Linux体系中:wget ftp://ftp.mirrorservice.org/sites/sourceware.org/pub/gcc/releases/gcc-7.1.0/gcc-7.1.0.tar.bz2

2.安装编译gcc必要的依靠包 sudo yum install gmp-devel mpfr-devel libmpc-devel -y

3.解压gcc压缩包到temp文件夹  tar -jxf gcc-7.1.0.tar.bz2 -C temp

4.进入到temp/gcc目次下,执行 gcc ./configure --enable-checking=release --enable-languages=c,c++ --disable-multilib && make 举办gcc的编译(这个步调耗时较长)

5.安装新版gcc  sudo make install

6.因为在./configure阶段未指定安装路径,那么新版的gcc的默认安装位置就是/usr/local/目次下,修改尺度库的软毗连使其指向新版本的尺度库 sudo ln -sf /usr/local/lib64/libstdc++.so.6.0.23 /lib64/libstdc++.so.6

7.必要行使c++17的特征时,必要在Makefile的CXXFLAGS变量中添加 -std=c++17

     gdb默认环境下是不支持c++容器输出的,不外在gdb 7.0版本之后,可以通过添加插件的方法来支持c++容器输出
1.搜查gdb版本 gdb --version, (假如版本号低于7.0就不消往下看了)
2.在当前用户的home目次中(如/home/sxhlinux)下载 插件代码 svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python (没有svn的,必要通过 sudo yum install svn -y 安装)然后执行mv python .gdb_stl 将该文件夹重定名(使其潜匿)
3.执行 vim ~/.gdbinit,编辑gdb设置文件,添加如下内容

add-auto-load-safe-path /usr/local/lib64/libstdc++.so.6.0.23-gdb.py  #文件的版本号,按照这个目次中的现实文件版本号确定

import sys
sys.path.append("/usr/local/share/gcc-7.1.0/python")
sys.path.insert(0,'/home/sxhlinux/.gdb_stl')   #注:将第二个参数中的路径改本钱身的.gdb_stl文件夹路径
from libstdcxx.v6.printers import register_libstdcxx_printers
register_libstdcxx_printers (None)
end 

二、gdb 调试示例

1.下面的代码是将带稀有字特性的分词(用unorder_map生涯),凭证必然的法则(分词的数字特性)举办归并

#include <iostream>
#include <cstdlib>
#include <map>
#include <unordered_map>
using namespace std;
template <typename T1,typename T2>
bool merge_tokens(T1 &target,const T2 &rules)
{
  auto pre = target.begin();
  for (auto token = target.begin(); token != target.end(); ) {
    if (pre == token) {
      token ++;
      continue;
    }
    auto range = rules.equal_range(pre->second);
    auto it = range.first;
    for (; it != range.second; it++) {
      if (it->second == token->second) {
        break;
      }
    }
    if (it == range.second) {
      pre = token;
      token ++;
    }
    else {
      pre->first += token->first;
//     target.insert(std::make_pair<typename T1::key_type,typename T1::mapped_type>(pre->first + token->first,16));
      pre->second = 16;
      token = target.erase(token);
      pre = token;
    }
  }
}

int main ( int argc,char *argv[] )

{

  unordered_map<string,size_t> tokens = {{"def",22},{"ghi",100},{"abc",22}};

  unordered_multimap<size_t,size_t> rules = {{22,{100,{1,38}};

  merge_tokens(tokens,rules);

 

  return EXIT_SUCCESS;

}        /* ---------- end of function main ---------- */ 

2. 编译该文件,提醒 31行

test.cpp:31:15: error: passing ‘const std::__cxx11::basic_string<char>' as ‘this' argument discards qualifiers [-fpermissive]

pre->first += token->first; 

~~~~~~~~~~~^~~~~~~~~~~~~~

/usr/local/include/c++/7.1.0/bits/basic_string.h:1122:7: note:   in call to ‘std::__cxx11::basic_string<_CharT,_Traits,_Alloc>& std::__cxx11::basic_string<_CharT,_Alloc>::operator+=(const std::__cxx11::basic_string<_CharT,_Alloc>&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]'

       operator+=(const basic_string& __str)

       ^~~~~~~~

     按照错误提醒:string 的运算符 += 要求参数是一个 const string范例(作为右值,非const范例也可以作为const范例的参数行使),返回值是一个string范例。再看 堕落的语句 pre->first += token->first; 按照mian函数中的tokens的界说,token和pre的first成员都应该是string而不是const string。

 3.将报错的这一行注释掉,然后用gdb查察下pre->first和token->first的详细范例。详细如下

(gdb) whatis target

type = std::unordered_map<std::__cxx11::basic_string<char,std::char_traits<char>,std::allocator<char> >,unsigned long> &

(gdb) whatis target.begin()

type = std::unordered_map<std::__cxx11::basic_string<char,unsigned long,std::hash<std::__cxx11::basic_string<char,std::allocator<char> > >,std::equal_to<std::__cxx11::basic_string<char,std::allocator<std::pair<std::__cxx11::basic_string<char,std::allocator<char> > const,unsigned long> > >::iterator

(gdb) whatis pre

type = std::__detail::_Node_iterator<std::pair<std::__cxx11::basic_string<char,unsigned long>,false,true> 

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读