The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Проблема с макросами"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Проблема с макросами" 
Сообщение от Yuran Искать по авторуВ закладки(ok) on 16-Сен-05, 17:07  (MSK)
Как написать макрос в С так, чтобы при вызове функции, например vasya_3 этот макро печатал 3?

как-то так
vasay_i()...\
printf("%d",i)...

Ну, типа, чтоб он обслуживал все вызовы vasay_i, где i - число!              

  Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]

1. "Проблема с макросами" 
Сообщение от Niam Искать по авторуВ закладки on 16-Сен-05, 18:31  (MSK)
>Как написать макрос в С так, чтобы при вызове функции, например vasya_3
>этот макро печатал 3?
>
>как-то так
> vasay_i()...\
> printf("%d",i)...
>
>Ну, типа, чтоб он обслуживал все вызовы vasay_i, где i - число!
>


Можно сделать #define vasia(i) printf("%d",i)

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "Проблема с макросами" 
Сообщение от Yuran Искать по авторуВ закладки(ok) on 16-Сен-05, 18:35  (MSK)
да не в том дело, мне нужно чтоб он обрабатывал vasay_1, vasay_2, и т.д.
  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "Проблема с макросами" 
Сообщение от sas emailИскать по авторуВ закладки(ok) on 16-Сен-05, 21:17  (MSK)
>да не в том дело, мне нужно чтоб он обрабатывал vasay_1, vasay_2,
>и т.д.

Попробуйте так

#include <stdio.h>

#define VASYA( i ) do { vasya_##i(); printf( "%d\n",i ); } while ( 0 )

void vasya_1( void )
{
printf( "vasya_1\n" );
}

void vasya_10( void )
{
printf( "vasya_10\n" );
}

int main( int argc, char ** argv )
{
VASYA( 10 );
VASYA( 1 );

return 0;
}

Удачи
--- sas

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

6. "Проблема с макросами" 
Сообщение от Yuran Искать по авторуВ закладки(ok) on 17-Сен-05, 13:50  (MSK)
>>да не в том дело, мне нужно чтоб он обрабатывал vasay_1, vasay_2,
>>и т.д.
>
>Попробуйте так
>
>#include <stdio.h>
>
>#define VASYA( i ) do { vasya_##i(); printf( "%d\n",i ); } while
>( 0 )
>
>void vasya_1( void )
>{
> printf( "vasya_1\n" );
>}
>
>void vasya_10( void )
>{
> printf( "vasya_10\n" );
>}
>
>int main( int argc, char ** argv )
>{
> VASYA( 10 );
> VASYA( 1 );
>
> return 0;
>}
>
>Удачи
> --- sas


Нет, мне не так нужно. невозможно описывать все vasay_i, что тогда делать? И ещё нельзя пихать i как параметр...

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

8. "Проблема с макросами" 
Сообщение от sas emailИскать по авторуВ закладки(ok) on 17-Сен-05, 23:35  (MSK)
>>>да не в том дело, мне нужно чтоб он обрабатывал vasay_1, vasay_2,
>>>и т.д.
>>
>>Попробуйте так
>>
>>#include <stdio.h>
>>
>>#define VASYA( i ) do { vasya_##i(); printf( "%d\n",i ); } while
>>( 0 )
>>
>>void vasya_1( void )
>>{
>> printf( "vasya_1\n" );
>>}
>>
>>void vasya_10( void )
>>{
>> printf( "vasya_10\n" );
>>}
>>
>>int main( int argc, char ** argv )
>>{
>> VASYA( 10 );
>> VASYA( 1 );
>>
>> return 0;
>>}
>>
>>Удачи
>> --- sas
>
>
>Нет, мне не так нужно. невозможно описывать все vasay_i, что тогда делать?
>И ещё нельзя пихать i как параметр.

1) Parameter vozmozhno vpihnit' (sm reshenie ot Niama)
2) Sudja po vsemu Vam nuzhno ispol'zovat' reshenie ot Niama. V chem krome napisania raznitsa mezhdu vasya_1 i vasya(1)?
3) Esli Vam uzh tak sil'no hochetsya, to kak skazali nizhe pishite Vash sobstvenni preprocessorna chem ugodno (shell/perl/ whatever)

Sovetuju snachala pochitat' pro C i ego preprocessor.

Udachi
--- sas

P.S. Sorry za translit. No po russki vslepuju ochen' dolgo

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "Проблема с макросами" 
Сообщение от elvenic Искать по авторуВ закладки(??) on 16-Сен-05, 23:40  (MSK)
>да не в том дело, мне нужно чтоб он обрабатывал vasay_1, vasay_2,
>и т.д.

Не умеет C-шный препроцессор такого делать. Может быть, m4 сумеет, но тогда надо явно в makefile указать что эти .c файлы перед компиляцией должны быть обработаны m4, и компилировать нужно уже результат работы m4.

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

5. "Проблема с макросами" 
Сообщение от sas emailИскать по авторуВ закладки(ok) on 16-Сен-05, 23:55  (MSK)
>>да не в том дело, мне нужно чтоб он обрабатывал vasay_1, vasay_2,
>>и т.д.
>
>Не умеет C-шный препроцессор такого делать. Может быть, m4 сумеет, но тогда
>надо явно в makefile указать что эти .c файлы перед компиляцией
>должны быть обработаны m4, и компилировать нужно уже результат работы m4.
>

Вы не правы

Удачи
--- sas

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

7. "Проблема с макросами" 
Сообщение от sas emailИскать по авторуВ закладки(ok) on 17-Сен-05, 23:25  (MSK)
>>>да не в том дело, мне нужно чтоб он обрабатывал vasay_1, vasay_2,
>>>и т.д.
>>
>>Не умеет C-шный препроцессор такого делать. Может быть, m4 сумеет, но тогда
>>надо явно в makefile указать что эти .c файлы перед компиляцией
>>должны быть обработаны m4, и компилировать нужно уже результат работы m4.
>>
>
>Вы не правы
>
>Удачи
>--- sas

Прошу прощения.
Не понял что требуется  


Удачи
--- sas

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

9. "Проблема с макросами" 
Сообщение от horsh Искать по авторуВ закладки(ok) on 21-Ноя-05, 02:41  (MSK)
>Как написать макрос в С так, чтобы при вызове функции, например vasya_3
>этот макро печатал 3?
>
>как-то так
> vasay_i()...\
> printf("%d",i)...
>
>Ну, типа, чтоб он обслуживал все вызовы vasay_i, где i - число!
>

Есть способ! Простой.
По стандарту языка C99 в каждой функции неявно определяется
const char * __func__ = "имя функции";

поэтому:

$cat t.c
#include <stdio.h>

#define MY_MACRO()      (atoi(__func__+4))

void foo_1(void)
{
    printf("%d\n", MY_MACRO());
}

void foo_2(void)
{
    printf("%d\n", MY_MACRO());
}

int
main(void)
{
    foo_1();
    foo_2();
    return 0;
}
$cc  t.c
$./a.out
1
2

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх


Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру