Как вставить макрос в строку? (Как говорится - стесняюсь спросить (на старости лет).)

Модератор: Модераторы разделов

Аватара пользователя
Zeus
Сообщения: 694

Как вставить макрос в строку?

Сообщение Zeus »

Код: Выделить всё

#define FUNCTION_NAME factory

std::string fn = FUNCTION_NAME;

void
FUNCTION_NAME ()
{
};


Как инициализировать fn? Ему нужна строка в кавычках, а мне этот макрос нужен без кавычек (в качестве имени функции).
Как это объяснить компилятору?
Спасибо сказали:
Аватара пользователя
Clear_Mind
Сообщения: 241
Статус: Изредко заглядывающий
ОС: openSuSE 11.1

Re: Как вставить макрос в строку?

Сообщение Clear_Mind »

Да вроде никак. Все дело в том, что макрос обрабатывается препроцессором, а не компилятором.
Можно что-то подобное сделать на C++ так:

Код: Выделить всё

class MyFunc {
public:
    MyFunc(std::string name);
    void operator()();
private:
    std::string name;
};


Объект функция с возможностью узнать имя функции (при правильной инициализации конечно)
Bombers launch with no recall + Minutes warning of the missile fall
Take a look at your last sky + Guessing you won't have the time to cry
--- Iron Maiden (Brouther Than A Thousand Suns, 2006)
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Как вставить макрос в строку?

Сообщение Zeus »

Clear_Mind писал(а):
03.07.2008 17:08
Да вроде никак. Все дело в том, что макрос обрабатывается препроцессором, а не компилятором.

Вот и вопрос: как "сказать" препроцессору вставить между кавычками значение макроса?
Спасибо сказали:
Аватара пользователя
Clear_Mind
Сообщения: 241
Статус: Изредко заглядывающий
ОС: openSuSE 11.1

Re: Как вставить макрос в строку?

Сообщение Clear_Mind »

Препроцессор будет игнорировать все что находится между кавычками -- ибо для него это строка, а не вызов макроса. Здесь единственный вариант -- сделать все ручками, но как-то это не правильно.

PS: как вариант -- еще один макрос

Код: Выделить всё

#define FUNCTION_NAME factory
#define QQ "

//....

std::string fn = QQ  FUNCTION_NAME QQ;

...не знаю заработает ли
Bombers launch with no recall + Minutes warning of the missile fall
Take a look at your last sky + Guessing you won't have the time to cry
--- Iron Maiden (Brouther Than A Thousand Suns, 2006)
Спасибо сказали:
Аватара пользователя
whirlwind
Сообщения: 67

Re: Как вставить макрос в строку?

Сообщение whirlwind »

поигрался, проверил :)

Код: Выделить всё

#define STRING1 str1
#define QQ "
#define QUOTEIT(sss) "sss"


сделал так:

Код: Выделить всё

printf("%s\n", QUOTEIT(STRING1) );

компилятор не ругался, но напечатало "sss" (т.е. параметр не прошел)

и еще вот так:

Код: Выделить всё

printf("%s\n", QQ STRING1 QQ );

на эту строку получаю ругательства компилятора

Код: Выделить всё

ddd.c:31: ошибка: отсутствует терминирующий символ "
ddd.c:31: ошибка: ‘str1’ undeclared (first use in this function)

хотя, если запустить с опцией -Е, видно, что код правильный. Странно.


Вообще, автор темы, как по-моему, пытается сделать нехорошее извращение. Разве нельзя использовать указатель на функцию?
Добро всегда побеждает зло. Мы победили, значит мы - добро.
Спасибо сказали:
Аватара пользователя
Clear_Mind
Сообщения: 241
Статус: Изредко заглядывающий
ОС: openSuSE 11.1

Re: Как вставить макрос в строку?

Сообщение Clear_Mind »

хотя, если запустить с опцией -Е, видно, что код правильный. Странно.

Есть вариант пользоваться отдельно препроцессором и отдельно компилятором ;)
Разве нельзя использовать указатель на функцию?

Я так понял необходимо чтоб строка и имя функции совпадало, для этого ранее я предложил вариант с объектом-функцией.
Bombers launch with no recall + Minutes warning of the missile fall
Take a look at your last sky + Guessing you won't have the time to cry
--- Iron Maiden (Brouther Than A Thousand Suns, 2006)
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Как вставить макрос в строку?

Сообщение Zeus »

У меня в одной единице компиляции софтина вытягивает из *.so указатель на функцию с определённым именем.
В другой единице компиляции (собственно - сама эта .so) должна быть функция с таким именем.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5456
ОС: Gentoo

Re: Как вставить макрос в строку?

Сообщение /dev/random »

#define quoting(a) #a

А вообще,
info cpp stringification
Спасибо сказали:
Аватара пользователя
Electronix
Сообщения: 53
ОС: Slackware, Suse, XP

Re: Как вставить макрос в строку?

Сообщение Electronix »

Вообще-то имя функции можно еще узнать вот так :

Код: Выделить всё

void SomeFunc()
{
         cout<<__func__<<endl; // выведет SomeFunc
}


У меня в одной единице компиляции софтина вытягивает из *.so указатель на функцию с определённым именем.
В другой единице компиляции (собственно - сама эта .so) должна быть функция с таким именем.

ИМХО, не лучшая идея, делать это с макросами.
We have no beginning, we have no end. We are infinite.
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Как вставить макрос в строку?

Сообщение Zeus »

Electronix писал(а):
03.07.2008 19:22
Вообще-то имя функции можно еще узнать вот так :

Код: Выделить всё

void SomeFunc()
{
         cout<<__func__<<endl; // выведет SomeFunc
}

Мне-то не нужно узнавать имя функции (да ещё в ней самой).
Мне нужно чтобы один программный модуль (программа) лез в другой программный модуль (библиотеку) за указателем на функцию и не ошибся с именем :)
Можно, конечно, прописать всё жёстко и в одном и в другом модуле, но, т.к. всё-равно оба модуля используют один h'ник то и пусть там будет прописано как называется функция.
И один - лезет за этой функцией, а второй - называет её именно так как надо.

Electronix писал(а):
03.07.2008 19:22
ИМХО, не лучшая идея, делать это с макросами.

А как это ещё делать? :unsure:
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Как вставить макрос в строку?

Сообщение Zeus »

/dev/random писал(а):
03.07.2008 19:17
#define quoting(a) #a

Код: Выделить всё

#include <iostream>

#define Test abc
#define quoting(a) #a

int
main ()
{
    std::string test=quoting(Test);
    std::cout << test << std::endl;
    return 0;
};

Как заставить этот код вывести abc?

/dev/random писал(а):
03.07.2008 19:17
А вообще,
info cpp stringification

Я, честно говоря, не понял как применить всё что там написано к моему случаю.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5456
ОС: Gentoo

Re: Как вставить макрос в строку?

Сообщение /dev/random »

Zeus писал(а):
03.07.2008 21:51
/dev/random писал(а):
03.07.2008 19:17
#define quoting(a) #a

Код: Выделить всё

#include <iostream>

#define Test abc
#define quoting(a) #a

int
main ()
{
    std::string test=quoting(Test);
    std::cout << test << std::endl;
    return 0;
};

Как заставить это код вывести abc?


(info cpp stringification) писал(а):

Код: Выделить всё

   If you want to stringify the result of expansion of a macro argument,
you have to use two levels of macros.

     #define xstr(s) str(s)
     #define str(s) #s
     #define foo 4
     str (foo)
          ==> "foo"
     xstr (foo)
          ==> xstr (4)
          ==> str (4)
          ==> "4"


Код: Выделить всё

#include <iostream>

#define Test abc
#define quoting(a) prequoting(a)
#define prequoting(a) #a

int
main ()
{
    std::string test=quoting(Test);
    std::cout << test << std::endl;
    return 0;
};
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Как вставить макрос в строку?

Сообщение Zeus »

Работает.
Спасибо.
Спасибо сказали: