<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          cppsC++腳本的(偽)解釋器

          聯(lián)合創(chuàng)作 · 2023-09-30 23:13

          cpps 是 C++ 腳本的(偽)解釋器

          思路很簡單,背后調(diào)用gcc來編譯,然后運(yùn)行生成的可執(zhí)行文件。
          * 不會弄臟你的目錄
          * 支持多個(gè).cpp文件
          * 可以鏈接庫
          * 支持預(yù)編譯頭文件
          * 支持shebang
          * 支持gcc支持的全部c++語法(必須的)

          交互式執(zhí)行地沒有,畢竟是偽的。

          需要用到
          gcc 4.9.1
          boost 1.57.0 (只用到了filesystem、program_options兩個(gè)子庫)

          為什么說是(偽)解釋器?

          因?yàn)樗⒉皇莻鹘y(tǒng)意義上的解釋器,而是背后調(diào)用gcc先對源代碼進(jìn)行編譯,然后再執(zhí)行產(chǎn)生的exe程序的。

          C++代碼本身就不適合解釋執(zhí)行,

          而我想要的不過是腳本的好處(而非解釋器的):

          • 就地編寫,就地運(yùn)行

          • 不用創(chuàng)建復(fù)雜的工程

          • 從edit->build->run的循環(huán)中刪掉build的環(huán)節(jié)

          因?yàn)镃++代碼編譯的時(shí)間也不短,所以cpps會緩存第一次運(yùn)行所產(chǎn)生的exe文件(放心,不會弄臟你的目錄)。

          另外,cpps還內(nèi)建了一個(gè)全透明的build system,當(dāng)你第一次運(yùn)行腳本之后,如果你對代碼又做了修改,再次運(yùn)行腳本時(shí),只有變動的部分才會被重新編譯。

          當(dāng)然,前提是你的腳本由多個(gè).cpp文件組成。

          編譯安裝

          mkdir build-cpps
          cd build-cpps
          cmake ../cpps
          make
          make test

          如果沒有問題的話

          sudo make install

          特別注意:

          我自己編譯時(shí)用的是

          • gcc 4.9.1

          • boost 1.57.0 (只用到了filesystem、program_options兩個(gè)子庫)

          如果腳本由一個(gè).cpp文件組成

          比如hello.cpp

          那你執(zhí)行下面這行即可:

          cpps hello.cpp

          如果腳本由多個(gè).cpp文件組成

          比如你的c++代碼位于目錄~/work/hello下,共有三個(gè)文件:

          hello.cpp

          foo.cpp

          foo.h

          如果你在hello.cpp中調(diào)用了foo.cpp中的某個(gè)函數(shù),那么

          在編譯環(huán)境下

          你需要在hello.cpp中寫

          #include "foo.h"

          然后將foo.cpp也加進(jìn)你的Makefile中。

          在解釋環(huán)境下

          你只需要給上面這行#include添加一條注釋即可

          #include "foo.h" // using foo.cpp

          這就相當(dāng)于python的import

          不需要什么Makefile

          然后執(zhí)行下邊這行即可

          cpps hello.cpp

          如果你在hello.cpp中使用了某個(gè)庫

          比如pthread

          在編譯環(huán)境下

          你需要在命令行寫-lpthread才能將該庫鏈接進(jìn)來

          在解釋環(huán)境

          你只要在任何一個(gè).cpp文件中加上這樣的注釋即可:

          // linklib pthread

          預(yù)編譯頭文件

          你還可以通過預(yù)編譯頭文件來加速

          比如你打算將std.h搞成預(yù)編譯頭文件

          那么只要在某個(gè).cpp文件中加上這樣的注釋

          #include "std.h" // precompile std.h

          還支持shebang

          在你的hello.cpp文件第一行寫上:

          #!/usr/bin/env cpps

          然后執(zhí)行

          chmod +x hello.cpp
          ./hello.cpp

          感覺是不是很爽?

          只可惜,這一行并不是合法的C++代碼

          cpps認(rèn)它,別的編譯器卻不認(rèn)它。

          更好的做法是:不要在.cpp文件中直接添加shebang,而是新建一個(gè)擴(kuò)展名為.cpps的文件,比如:

          hello.cpps

          然后在這個(gè)文件中的第一行寫shebang,第二行給出.cpp腳本的路徑(絕對路徑、相對路徑都可以),如下:

          #!/usr/bin/env cpps
          hello.cpp

          然后將這個(gè).cpps文件設(shè)置成可執(zhí)行的

          chmod +x hello.cpps
          ./hello.cpps

          咦? 好像在個(gè)shell腳本中調(diào)用cpps hello.cpp即可

          干干凈凈運(yùn)行

          cpps --clear hello.cpp 相當(dāng)于先clear all,再build,然后運(yùn)行。

          如果你用新版本的cpps運(yùn)行以前運(yùn)行過的C++程序時(shí)遇到問題,可以這樣試一下。

          瀏覽 20
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          編輯 分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          編輯 分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲,日韩,aⅴ在线欧美 | 久久久久亚洲AV成人无在 | 擼擼夜夜| 欧美视频网站在线观看 | 成人精品一区二区三区 |