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