亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++調試記錄與心得分享

2020-01-26 14:01:07
字體:
來源:轉載
供稿:網友

 之前開發用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 syssys.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_printersregister_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}, {100, 22}, {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, _Traits, _Alloc>::operator+=(const std::__cxx11::basic_string<_CharT, _Traits, _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 targettype = 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, std::char_traits<char>, std::allocator<char> >, unsigned long, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, unsigned long> > >::iterator(gdb) whatis pretype = std::__detail::_Node_iterator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, unsigned long>, false, true> 

     根據上面顯示的,target兩個參數類型確實和定義的一樣,string和unsigned long;target.begin()類型說明中的std::allocator的模板參數pair的第一個參數為 string const,說明在創建unordered_map時,key的類型為const string而不是string(猜測這跟map與key相關的只有增加、刪除而沒有修改操作有關)。因為allocator在申請空間時,已經隱式的將string轉成了const string,所以,pre->first的類型是const string而不是string(也就無法進行+=,=等相關操作)。

 
4.根據第三步的分析結果,要實現合并元素的效果,只能是將合并后的值作為一個新的pair插入到原來的map中,然后將原來的兩個pair刪除。代碼如下:

target.insert(std::make_pair<typename T1::key_type, typename T1::mapped_type>(pre->first + token->first, 16));target.erase(pre);token = target.erase(token);pre = token; 

三、總結

     很多時候我們遇到問題首先想到的是將錯誤復制下來,然后粘貼到google搜索框中,漫無目的的去尋找答案,而不是仔細分析查看gcc給出的錯誤提示。跟我的經驗,很多時候gcc給出的提示相當明顯,認真仔細閱讀大部分可以很快找出解決方案,剩余的一部分棘手問題可以借助搜索引擎(PS:當搜索英文提示時,如果沒有google,可以使用英文版的必應,效果也不錯)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美极品在线视频| 欧美小视频在线| 亚洲电影在线观看| 日韩在线观看视频免费| 欧美亚洲午夜视频在线观看| 欧美小视频在线观看| 中文在线不卡视频| 久久91精品国产91久久久| 91牛牛免费视频| 色哟哟网站入口亚洲精品| 国产精品免费久久久久影院| 中文字幕日韩欧美在线视频| 性色av一区二区三区在线观看| 中文字幕一精品亚洲无线一区| 亚洲另类激情图| 国产精品色悠悠| 91av在线网站| 国产在线精品自拍| 这里只有精品视频| 国产精品爱啪在线线免费观看| 亚洲国产精品一区二区三区| 中文国产成人精品久久一| 国产91精品久久久久久| 国产亚洲精品一区二555| 日韩成人网免费视频| 日韩欧美成人免费视频| 亚洲一区二区三区在线视频| 中文字幕日韩精品在线观看| 亚洲欧洲一区二区三区久久| 91久久久久久国产精品| 日韩电影大片中文字幕| 国产日韩欧美一二三区| 亚洲第一福利网| 亲爱的老师9免费观看全集电视剧| 欧美整片在线观看| 欧美日韩人人澡狠狠躁视频| 日韩免费在线免费观看| 欧美性videos高清精品| 国产在线不卡精品| 成人午夜激情网| 日韩av在线播放资源| 亚洲理论在线a中文字幕| 性色av香蕉一区二区| 久久久国产一区二区| 国产丝袜一区二区三区免费视频| 亚洲天堂av在线免费| 欧美日韩免费网站| 久久久精品一区| 欧美日韩免费一区| 成人在线免费观看视视频| 美女999久久久精品视频| 久久久国产影院| 欧美日韩在线看| 亚洲欧美制服另类日韩| 91精品国产成人www| 青青久久av北条麻妃海外网| 欧美一区在线直播| 日韩av影院在线观看| 亚洲自拍高清视频网站| 亚洲视频在线观看免费| 全色精品综合影院| 午夜精品免费视频| 成人免费网站在线观看| 亚洲欧美在线一区| 国产成人欧美在线观看| 欧美性videos高清精品| 国产精品久久一区主播| 亚洲国产美女精品久久久久∴| 日本中文字幕久久看| 久久久久99精品久久久久| 欧美福利小视频| 久久国产精品久久久久久| 亚洲精品v天堂中文字幕| 色悠悠久久久久| 欧美日韩免费在线观看| 亚洲影影院av| 日韩精品极品视频免费观看| 伊人久久大香线蕉av一区二区| 秋霞av国产精品一区| 国产精品美女av| 久久夜色精品国产亚洲aⅴ| 欧美丝袜一区二区三区| 91情侣偷在线精品国产| 日韩中文字幕视频| 亚洲va欧美va在线观看| 欧美成人免费全部| 亚洲va欧美va国产综合剧情| 亚洲性线免费观看视频成熟| 国产精品www网站| 亚洲人成网在线播放| 亚洲片在线资源| 亚洲高清免费观看高清完整版| 欧美激情一区二区三区高清视频| 欧美性受xxxx黑人猛交| 在线观看欧美视频| 富二代精品短视频| 国产丝袜一区视频在线观看| 久久精彩免费视频| 欧美成人黑人xx视频免费观看| 精品国偷自产在线视频| 久久全球大尺度高清视频| 国产精品久久久久久久久免费看| 亚洲天天在线日亚洲洲精| 亚洲激情电影中文字幕| 国产一区二区视频在线观看| 精品无人区太爽高潮在线播放| 国产成人鲁鲁免费视频a| 亚洲成人黄色网址| 欧美乱人伦中文字幕在线| 久久久久久久久久久91| 欧美久久精品一级黑人c片| 久久99久久99精品中文字幕| 狠狠躁18三区二区一区| www.亚洲免费视频| 久久久久亚洲精品成人网小说| 国产精品久久久久久搜索| 日韩av在线导航| 日韩电影免费观看在线| 久久伊人免费视频| 青青草成人在线| 亚洲黄色片网站| 国产精品aaa| 国产成人涩涩涩视频在线观看| 欧美日韩美女在线| 欧美丰满老妇厨房牲生活| 亚洲欧美中文字幕| 精品动漫一区二区| 日韩经典一区二区三区| 精品日本高清在线播放| 亚洲欧美一区二区三区四区| 亚洲一区二区三区在线免费观看| 国产成人自拍视频在线观看| 日韩电影中文字幕在线观看| 清纯唯美亚洲综合| 亚洲精品www| 伊人男人综合视频网| 国产精品福利网站| 久青草国产97香蕉在线视频| 日本91av在线播放| 精品亚洲一区二区三区| 精品国偷自产在线视频99| 日韩av在线网站| 亚洲色图狂野欧美| 欧美成人免费播放| 亚洲资源在线看| www.欧美免费| 91精品视频观看| 日韩av影院在线观看| 国产精品久久久久免费a∨大胸| 亚洲男人的天堂网站| 精品在线欧美视频| 欧美精品制服第一页| 国产一区二区三区视频在线观看| 中文字幕综合一区| 亚洲精品福利免费在线观看| 伊人久久综合97精品| 欧美日韩午夜视频在线观看| 国产成人亚洲综合91精品| 美女久久久久久久久久久| 色婷婷av一区二区三区在线观看| 亚洲精品自产拍| 午夜精品视频网站| 黑人巨大精品欧美一区二区一视频| 亚洲精品网站在线播放gif|