С Unstringification с помощью макросов - PullRequest
3 голосов
/ 28 августа 2010

Есть ли способ расстегнуть строки, предоставляемые в качестве аргументов макроса? Мне нужно иметь возможность вызывать функции, имена которых в строках. Примерно так:

void hello() {
    printf("Hello, world!");
}

call_func("hello");

Как бы я реализовал call_func. Он будет находиться в модуле #include d и будет использоваться для вызова функций в главном файле c. Если есть другой способ сделать это, когда имя не должно быть в строках, но может быть передано в качестве аргумента функции, которая будет в порядке. Вот что я имею в виду:

#define call_func(X) X()
void do_something(Some_kind_of_C_func_type i) {
    call_func(i)
}
void hello() {
    printf("Hello, world!");
}

do_something(C_FUNC(hello));

Ответы [ 2 ]

1 голос
/ 28 августа 2010

Хорошо, я вижу два способа сделать это, в зависимости от ваших целей.

Сначала указатели функций;по сути, рассматривает функцию как переменную.См. здесь для краткого обзора.

Кроме того, вы можете создать код, который вы хотите вызвать таким образом, как общую библиотеку, а затем использовать что-то вроде dlopen () или LoadLibrary ()откройте библиотеку, а затем используйте любой интерфейс для доступа к переменным / функциям.

0 голосов
/ 28 августа 2010

Хотя не совсем понятно, чего вы хотите достичь, вы не можете использовать макросы, чтобы взять строку, введенную во время выполнения, и решить функцию с тем же именем.

Что вы можете сделать, это зарегистрировать все функции в списке (или чуть более сложной структуре данных) и вызвать их по имени.

#define INSERT(fn) addfn(#fn, &fn)
void addfn(char const* name, func_t fp);

Где addfn может взять выданный указатель и поместить его в словарь под записью name.

...