2010-04-04 2 views
2

Я использую LLVM-clang для Linux.llvm clang struct создает функции на лету

Пусть в 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

+2

У clang есть библиотека парсера, которая должна быть в состоянии сделать это. Вы можете использовать его изнутри программы для синтаксического анализа этого строкового литерала как единицы перевода и заставить его перезванивать ваши функции, когда он закончит разбирать вещи, чтобы вы могли испускать правильный код. –

+1

@kennyTM: где несоответствия? – anon

ответ

1

Если вы действительно хотите, чтобы сделать такого рода вещи, вы должны связать в целом лязг, и научиться использовать свой сложный и постоянно меняющийся API. Вы уверены, что вам это действительно нужно?

1

C++ , будучи скомпилированным языком (обычно), не может делать то, что вы хотите, потому что во время выполнения компилятор больше не собирается выполнять вид разбора и создания кода, который вам нужен для вашей функции magic. Это фундаментальное различие между скомпилированными и интерпретируемыми языками.

Если вы действительно хотите делать то, что вы просите, вы, по сути, должны написать синтаксический анализатор, который может анализировать определение структуры C++ и работать, как LLVM выкладывает такую ​​структуру в памяти. Однако это, вероятно, не совсем то, что вы хотите сделать.

Какая проблема, по вашему мнению, проблема здесь? Это звучит, как если бы вы могли бы использовать шаблоны, чтобы сделать то, что вы хотите - по этим линиям:

template <class T> 
int magic(T a, T b) 
{ 
    return a.x + b.x; 
} 
Смежные вопросы