2010-04-04 41 views
2

我在Linux上使用LLVM-clang。llvm clang結構創建函數的功能

假設在Foo.cpp中我有:

struct Foo { 
    int x, y; 
}; 

如何創建一個功能 「神奇」 這樣的:

typedef (Foo) SomeFunc(Foo a, Foo b); 

SomeFunc func = magic("struct Foo { int x, y; };"); 

使:

func(SomeFunc a, SomeFunc b); // returns a.x + b.y; 

注:

因此,基本上,「神奇」需要採取char*,已經LLVM解析它來獲得C++如何勾畫出的結構,然後創建基於返回a.x + b.y;

+1

請修改您的代碼。很多不一致。 – kennytm 2010-04-04 06:37:39

+2

clang有一個解析器庫,應該可以做到這一點。你可以在程序中使用它來解析這個字符串作爲一個翻譯單元,並且當它完成解析事件時讓它回調你的函數,這樣你就可以發出正確的代碼。 – 2010-04-04 22:02:22

+1

@kennyTM:不一致在哪裏? – anon 2010-04-05 07:35:56

回答

1

如果你真想做這樣的東西,你必須在整個鐺鏈接,並學習如何使用其複雜且不斷變化的API。你確定你真的需要它嗎?

1

C中的飛行功能++作爲一種編譯語言(通常),不能做你想做的事情,因爲在運行時,編譯器不再需要爲你的magic函數進行那種解析和代碼創建。這是編譯和解釋語言之間的根本區別。

如果你真的想做的事你問什麼,你會在效果上必須寫一個解析器,可以解析C++結構的定義,並制定LLVM如何勾畫出這樣的結構在內存中。但是,這可能不是你想要做的。

你在這裏試圖解決的更大的問題是什麼?聽起來好像你可能能夠使用模板做你想要的東西 - 沿着這些線路:

template <class T> 
int magic(T a, T b) 
{ 
    return a.x + b.x; 
}