Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Препроцессор 
V
    Опции темы
cupper
Дата 11.4.2010, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: 1
Всего: 1



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

#define TEST(name) my_ ## name();

void my_Func(){
    printf("AAAAAAAAAA\n");
}

int main(void)
{ 
    
    TEST(Func);
    return 0;
}

Все работает.
А тут
Код

#define TEST(name) " my_ ## name() "

void my_Func(){
    printf(TEST(test));
}

int main(void)
{ 
    
    my_Func();
    return 0;
}

ничего не работает
Выход:
Код

 my_ ## name() 

Почему так ?


PS. и как правильно запустить препроцессор у gcc  чтобы проверять правильность формирования макроса ?
PM MAIL   Вверх
boostcoder
Дата 11.4.2010, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(cupper @  11.4.2010,  20:59 Найти цитируемый пост)
и как правильно запустить препроцессор у gcc  чтобы проверять правильность формирования макроса ? 

cpp in_file_name.ext
PM WWW   Вверх
cupper
Дата 11.4.2010, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: 1
Всего: 1



Запуск только препроцессора делаю так
Код

gcc -E test.c

Оснвной вопрос все также остался. Появился еще один, как можно в теле макроса заставить правильно отработать __func__ чтобы получить имя функции из которой был вызван макрос ? как не пробовал он всегда так и остается как __func__

PS. было понято что __func__ это не стандартный макрос, который отрабатывает после препроцессора.
Очень хотелосьбы чтобы я это понял не правильно, ибо тогда некак неполучиться сделать что то вроде

Код

#define TEST my_##__func__();

void my_Func(){
    printf("Good\n");
}

void Func(){
    TEST
}

int main(void)
{ 
    Func();
    return 0;
}

А очень хотелосьюы сделать такое

Второй вопрос в том как можно скомпоновать __func__ с чемто еще, например определен макрос
Код

#define BLA_lol 10
#define TEST BLA_##__func__
void lol(){
     print("%i",TEST)
}

 ? ? ?

Это сообщение отредактировал(а) cupper - 11.4.2010, 23:53
PM MAIL   Вверх
mes
Дата 11.4.2010, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(cupper @  11.4.2010,  19:59 Найти цитируемый пост)

Почему так ?

потому что ## внутри кавычек,
для решения разделите на несколько макросов, один раскрывающий, один соединяющий, один оборачивающий в кавычки.




Это сообщение отредактировал(а) mes - 11.4.2010, 23:51


--------------------
PM MAIL WWW   Вверх
cupper
Дата 11.4.2010, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: 1
Всего: 1



Цитата(mes @ 11.4.2010,  23:51)
Цитата(cupper @  11.4.2010,  19:59 Найти цитируемый пост)

Почему так ?

потому что ## внутри кавычек,
для решения разделите на несколько макросов, один раскрывающий, один соединяющий, один оборачивающий в кавычки.

непонял ка кразделить на 3 макроса, в голову лезет только вот такое
Код

#define MOD(name) my_##name()
#define TEST(name) "MOD(name)"

но не работает по той же причине

Это сообщение отредактировал(а) cupper - 11.4.2010, 23:59
PM MAIL   Вверх
mes
Дата 12.4.2010, 00:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(cupper @  11.4.2010,  21:56 Найти цитируемый пост)
TEST my_##__func__();

макрос __func__ возвращает насколько я знаю строку, а значит использовать для вызова не подойдет

Цитата(cupper @  11.4.2010,  22:59 Найти цитируемый пост)
непонял ка кразделить на 3 макроса, в голову лезет только вот такое

опишите задачу,а то не понятно что требуется..

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


--------------------
PM MAIL WWW   Вверх
xvr
Дата 12.4.2010, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Код

#define TEST(name) " my_" #name "() "

По поводу __func__ - это не макрос, а строковый литерал или переменная:
Цитата

 These identifiers are not preprocessor macros.  In GCC 3.3 and
earlier, in C only, `__FUNCTION__' and `__PRETTY_FUNCTION__' were
treated as string literals; they could be used to initialize `char'
arrays, and they could be concatenated with other string literals.  GCC
3.4 and later treat them as variables, like `__func__'.  In C++,
`__FUNCTION__' and `__PRETTY_FUNCTION__' have always been variables.


Это сообщение отредактировал(а) xvr - 12.4.2010, 11:31
PM MAIL   Вверх
cupper
Дата 12.4.2010, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: 1
Всего: 1



Цитата(mes @ 12.4.2010,  00:27)
Цитата(cupper @  11.4.2010,  21:56 Найти цитируемый пост)
TEST my_##__func__();

макрос __func__ возвращает насколько я знаю строку, а значит использовать для вызова не подойдет

Цитата(cupper @  11.4.2010,  22:59 Найти цитируемый пост)
непонял ка кразделить на 3 макроса, в голову лезет только вот такое

опишите задачу,а то не понятно что требуется..

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

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

#define XX_Y_func1 1 
#define XX_Y_func2 2
#define XX_Y_func3 3

void func1(){
     x = XX_Y_func1
}

void func2(){
     x = XX_Y_func2
}

void func3(){
     x = XX_Y_func3
}

Я тело функции конечно другое, схема такая. Я хотел бы сделать универсальный макрос, чтобы независимо от функции можно было вызывать один и тот же макрос, а он бы определял определял имя функции и "собирал" нужный макрос.
Но я уже начинаю понимать что это была плохая затея. И лучьше сделать макрос который будет которому передавалосьбы имя функции а в нем выстраивалась вся функция. Так и проще сделать и наглядней применять.
PM MAIL   Вверх
xvr
Дата 12.4.2010, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(cupper @ 12.4.2010,  11:44)
__func__ возвращает строку, без кавычек, если он ее возвращает на на этапе препроцессинга

Не возвращает, это не макрос препроцессора. __func__ отрабатывается компилятором

Исходный код -
Код

#include <stdio.h>

int main()
{
 printf("%s\n",__func__);
 return 0;
}


После препроцессора - 
Код

...
... Куча хлама из stdio.h ...
...
int main()
{
 printf("%s\n",__func__);
 return 0;
}

Результат исполнения -
Цитата

main


Цитата

то что мешает эту строку использовать как оператор ?
Это и мешает - не строка это

PM MAIL   Вверх
mes
Дата 12.4.2010, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(cupper @  12.4.2010,  10:44 Найти цитируемый пост)
Основная задача такая. 
Есть набор макросов, есть набор однотипных функций. Каждой функции соответствует свой макрос, выглядит это примерно так

Это не задача, а предположительный способ реализации.

Добавлено через 2 минуты и 48 секунд
Цитата(cupper @  12.4.2010,  10:44 Найти цитируемый пост)
__func__ возвращает строку, без кавычек, 

без кавычек ?! с ними smile



--------------------
PM MAIL WWW   Вверх
cupper
Дата 12.4.2010, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: 1
Всего: 1



Цитата(mes @ 12.4.2010,  12:15)
Цитата(cupper @  12.4.2010,  10:44 Найти цитируемый пост)
Основная задача такая. 
Есть набор макросов, есть набор однотипных функций. Каждой функции соответствует свой макрос, выглядит это примерно так

Это не задача, а предположительный способ реализации.

Добавлено @ 12:17
Цитата(cupper @  12.4.2010,  10:44 Найти цитируемый пост)
__func__ возвращает строку, без кавычек, 

без кавычек ?! с ними smile

Значит изначально я все правильно понял. Тогда такой вариант точно отпадает. Спасибо.

Добавлено @ 13:52
Возник еще вопрос. Вот код
Код

#define __STR(X) #X            
#define STR(X) __STR(X)

#define FUNCx(x, name, ...)                    \
    void name (__SC_DECL##x(__VA_ARGS__))            \
    {                            \
...
            "\tmovl $"STR(_SR_##name)", %%eax\n"    \
...
    }


В таком вариант строчка после препроцессора содержит вместо имени макросв нужно значение, все правильно. Как можно избежать зависимости от мокросов STR и __STR ? 
Нужно чтобы в итоге строчка была такая 
Код

"\tmovl $69, %%eax\n"

Приведеный выше код абсолютно правильно отрабатывает и получает чтрочку
Код

"\tmovl $""69"", %%eax\n"

являющейся абсолютно правильной, но хотелосьбы избавить от макроса STR, чтобы было как то так
Код

#define FUNCx(x, name, ...)                    \
    void name (__SC_DECL##x(__VA_ARGS__))            \
    {                            \
...
            "\tmovl $_SR_##name, %%eax\n"    \
...
    }

Но это не работает, видимо из за того что макрос стоящий в кавычках не явлеятся макросом. Можно сделать так
Код

...
"\tmovl $"#_SR_##name", %%eax\n"
...

Но это тоже не работает. Есть ли еще варианты, или такое нельзя проделать без использования STR ?

Это сообщение отредактировал(а) cupper - 12.4.2010, 13:52
PM MAIL   Вверх
mes
Дата 12.4.2010, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(cupper @  12.4.2010,  12:42 Найти цитируемый пост)
Есть ли еще варианты, или такое нельзя проделать без использования STR ?

без макроса посредника - нельзя



--------------------
PM MAIL WWW   Вверх
cupper
Дата 12.4.2010, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: 1
Всего: 1



Цитата(mes @ 12.4.2010,  13:59)
Цитата(cupper @  12.4.2010,  12:42 Найти цитируемый пост)
Есть ли еще варианты, или такое нельзя проделать без использования STR ?

без макроса посредника - нельзя

благодарствоваю

Это сообщение отредактировал(а) cupper - 12.4.2010, 14:33
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0610 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.