Cling Metaprocessor

  • 4
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

Metaprocessor

Clingのページに、Metaprocessorの説明があります。
これ以外にもいくつかのコマンドがhelpにありました。

.q

Clingを終了します。

.help

Clingのヘルプを表示します。

.L Library

ライブラリまたはファイルを読み込みます。

[cling]$ .L z
[cling]$ #include <zlib.h>
[cling]$ zlibVersion()
(const char *) "1.2.8"

.L zでも.L libzでも、.L libz.soでも同じでした。

ライブラリが見つからない場合、内部で#include "Library"が呼ばれます。
それも見つからない場合、次のようなエラーが発生します。

[cling]$ .L Library
input_line_4:1:10: fatal error: 'Library' file not found
#include "Library"
         ^

ライブラリが読み込まれていない状態でライブラリの関数などを呼び出すと ExecutionContext: use of undefined symbol '...'!が発生します。

Ubuntuのパッケージなどでインストールした場合、soファイルが /usr/libではなく、 /usr/lib/x86_64-linux-gnuなどに置かれていることがあります。
そのため、.Lで読み込もうとしてもパスの通った場所にsoファイルが存在せず、インクルードと解釈され、さらに同名のファイルが存在しなければ上記のエラーが発生します。
この場合、 cling -L/usr/lib/x86_64-linux-gnuのように実行時にオプションを用いてライブラリパスを通す必要があります。

.I path

インクルードパスを設定します。
cling実行時に-Iオプションを付けるのと同じです。

.x filename.cxx

この例の場合、filename.cxxを読み込み、void filename()が存在したら実行します。
filenameは任意のファイル名です。

もしファイル内に関数が存在しないなら、次のようなエラーが発生します。

input_line_5:2:2: error: use of undeclared identifier 'filename'
 filename()
 ^

.rawInput

インタプリタで関数を宣言すると、以下のようなエラーが発生します。

[cling]$ #include <iostream>
[cling]$ void test(){
[cling]$ ?   std::cout << "Hello World!" << std::endl;
[cling]$ ?   }
input_line_5:2:13: error: function definition is not allowed here
 void test(){
            ^

関数の前後に.rawInputを入力することで解決します。

[cling]$ #include <iostream>
[cling]$ .rawInput
Using raw input
[cling]! void test(){
[cling]! ?   std::cout << "Hello World!" << std::endl;
[cling]! ?   }
[cling]! .rawInput
Not using raw input
[cling]$ test()
Hello World!

.printAST

ヘルプの説明を直訳すると抽象構文木を表示するとかなんとか…。

試してみたところ、次のようになりました。

[cling]$ .printAST
Printing AST
[cling]$ int a = 123;

-------------------Declaration---------------------
FunctionDecl 0xb2cd0b0 <input_line_4:1:1, line:4:1> __cling_Un1Qu30 'void (void)'
`-CompoundStmt 0xb2cd188 <line:1:24, line:4:1>
  |-DeclStmt 0xb2cd168 <line:2:2, col:13>
  | `-VarDecl 0xb2cd120 <col:2, col:10> a 'int'
  |   `-IntegerLiteral 0xb2cd150 <col:10> 'int' 123
  |-DeclRefExpr 0xb2cd1a8 <col:14> 'int' lvalue Var 0xb2cd120 'a' 'int'
  `-NullStmt 0xb2cd178 <line:3:1>

------------------Declaration Body---------------
CompoundStmt 0xb2cd188
|-DeclStmt 0xb2cd168
| `-VarDecl 0xb2cd120 a 'int'
|   `-IntegerLiteral 0xb2cd150 'int' 123
|-DeclRefExpr 0xb2cd1a8 'int' lvalue Var 0xb2cd120 'a' 'int'
`-NullStmt 0xb2cd178

---------------------------------------------------
[cling]$ .printAST
Not printing AST

Reference