欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

C++調(diào)試記錄和心得有哪些

C++調(diào)試記錄和心得有哪些,相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。

盧龍網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。創(chuàng)新互聯(lián)2013年開創(chuàng)至今到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。

一、環(huán)境搭建

     本人使用的是CentOS 7系統(tǒng),該系統(tǒng)默認(rèn)的g++版本不支持c++17的新特性。所以,首先需要做的就是升級(jí)新版本的g++。
1.到ftp://ftp.mirrorservice.org/sites/sourceware.org/pub/gcc/releases/網(wǎng)站上選擇支持c++17的gcc版本,并使用wget下載到Linux系統(tǒng)中: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.進(jìn)入到temp/gcc目錄下,執(zhí)行 gcc ./configure --enable-checking=release --enable-languages=c,c++ --disable-multilib && make 進(jìn)行g(shù)cc的編譯(這個(gè)步驟耗時(shí)較長)

5.安裝新版gcc  sudo make install

6.由于在./configure階段未指定安裝路徑,那么新版的gcc的默認(rèn)安裝位置就是/usr/local/目錄下,修改標(biāo)準(zhǔn)庫的軟連接使其指向新版本的標(biāo)準(zhǔn)庫 sudo ln -sf /usr/local/lib64/libstdc++.so.6.0.23 /lib64/libstdc++.so.6

7.需要使用c++17的特性時(shí),需要在Makefile的CXXFLAGS變量中添加 -std=c++17

     gdb默認(rèn)情況下是不支持c++容器輸出的,不過在gdb 7.0版本之后,可以通過添加插件的方式來支持c++容器輸出
1.檢查gdb版本 gdb --version, (如果版本號(hào)低于7.0就不用往下看了)
2.在當(dāng)前用戶的home目錄中(如/home/sxhlinux)下載 插件代碼 svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python (沒有svn的,需要通過 sudo yum install svn -y 安裝)然后執(zhí)行mv python .gdb_stl 將該文件夾重命名(使其隱藏)
3.執(zhí)行 vim ~/.gdbinit,編輯gdb配置文件,添加如下內(nèi)容

add-auto-load-safe-path /usr/local/lib64/libstdc++.so.6.0.23-gdb.py  #文件的版本號(hào),根據(jù)這個(gè)目錄中的實(shí)際文件版本號(hào)確定

import sys
sys.path.append("/usr/local/share/gcc-7.1.0/python")
sys.path.insert(0, '/home/sxhlinux/.gdb_stl')   #注:將第二個(gè)參數(shù)中的路徑改成自己的.gdb_stl文件夾路徑
from libstdcxx.v6.printers import register_libstdcxx_printers
register_libstdcxx_printers (None)
end

二、gdb 調(diào)試示例

1.下面的代碼是將帶有數(shù)字特征的分詞(用unorder_map保存),按照一定的規(guī)則(分詞的數(shù)字特征)進(jìn)行合并

#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)

       ^~~~~~~~

     根據(jù)錯(cuò)誤提示:string 的運(yùn)算符 += 要求參數(shù)是一個(gè) const string類型(作為右值,非const類型也可以作為const類型的參數(shù)使用),返回值是一個(gè)string類型。再看 出錯(cuò)的語句 pre->first += token->first; 根據(jù)mian函數(shù)中的tokens的定義,token和pre的first成員都應(yīng)該是string而不是const string。

 3.將報(bào)錯(cuò)的這一行注釋掉,然后用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, 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 pre

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

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

 
4.根據(jù)第三步的分析結(jié)果,要實(shí)現(xiàn)合并元素的效果,只能是將合并后的值作為一個(gè)新的pair插入到原來的map中,然后將原來的兩個(gè)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;

     很多時(shí)候我們遇到問題首先想到的是將錯(cuò)誤復(fù)制下來,然后粘貼到google搜索框中,漫無目的的去尋找答案,而不是仔細(xì)分析查看gcc給出的錯(cuò)誤提示。很多時(shí)候gcc給出的提示相當(dāng)明顯,認(rèn)真仔細(xì)閱讀大部分可以很快找出解決方案,剩余的一部分棘手問題可以借助搜索引擎。

看完上述內(nèi)容,你們掌握C++調(diào)試記錄和心得有哪些的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

網(wǎng)頁題目:C++調(diào)試記錄和心得有哪些
轉(zhuǎn)載注明:http://chinadenli.net/article10/ihjcdo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)公司品牌網(wǎng)站設(shè)計(jì)、營銷型網(wǎng)站建設(shè)、網(wǎng)站收錄標(biāo)簽優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)
99久久人妻中文字幕| 欧美成人免费夜夜黄啪啪 | 日本一区不卡在线观看| 夜色福利久久精品福利| 中文日韩精品视频在线| 欧美91精品国产自产| 久久99青青精品免费| 麻豆精品在线一区二区三区| 国产精品伦一区二区三区在线| 亚洲中文字幕在线观看黑人| 欧美欧美欧美欧美一区| 国产又粗又爽又猛又黄的| 国产又粗又猛又爽又黄的文字| 精品一区二区三区三级视频| 欧美美女视频在线免费看| 欧美韩日在线观看一区| 婷婷基地五月激情五月| 美女极度色诱视频在线观看| 国产麻豆精品福利在线| 高清一区二区三区不卡免费| 色哟哟在线免费一区二区三区| 亚洲伦理中文字幕在线观看| 国产亚洲欧美另类久久久| 五月情婷婷综合激情综合狠狠| 日韩一区二区三区在线欧洲| 香蕉久久夜色精品国产尤物 | 欧美同性视频免费观看| 最近中文字幕高清中文字幕无| 国产精品夜色一区二区三区不卡| 国产美女网红精品演绎| 国产成人精品资源在线观看| 91午夜少妇极品福利| 九九热精品视频免费在线播放| 国产一区二区三区午夜精品| 免费观看一级欧美大片| 国产精品香蕉在线的人| 亚洲精品偷拍视频免费观看| 狠狠干狠狠操亚洲综合| 日韩国产欧美中文字幕| 国内自拍偷拍福利视频| 日本人妻丰满熟妇久久|