Возможен ли такой макрос
От: dynamic  
Дата: 25.09.09 08:19
Оценка:
Добрый день.

Хочется чтобы мкрос в зависимости от имени файла делал разные подстановки в код
т.е

имеем вызов макроса showName();

а макрос смотрит если текущее имя файла __LINE__== "bodies.cc" то подставляем
this->Name();
а иначе подставляем
ths->Name();

Заранее очень благодрен.
Re: Возможен ли такой макрос
От: jazzer Россия Skype: enerjazzer
Дата: 25.09.09 08:30
Оценка: 3 (1)
Здравствуйте, dynamic, Вы писали:

D>Добрый день.


D>Хочется чтобы мкрос в зависимости от имени файла делал разные подстановки в код


Нельзя, так как текущее имя файла — это строковый литерал, который невозможно обработать препроцессором.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: Возможен ли такой макрос
От: Chorkov Россия  
Дата: 25.09.09 08:35
Оценка: 3 (1) +1
Здравствуйте, dynamic, Вы писали:

D>Добрый день.


D>Хочется чтобы мкрос в зависимости от имени файла делал разные подстановки в код

D>т.е

D>имеем вызов макроса showName();


D>а макрос смотрит если текущее имя файла __LINE__== "bodies.cc" то подставляем

this->>Name();
D>а иначе подставляем
ths->>Name();

D>Заранее очень благодрен.


Вариант А:
#define FOO() ( DoSomthing(strcmp(__FILE__, "bodies.cc") == 0 ? this->Name() : ths->Name() ) )



Более разумный вариант:
// FOO.h
#ifndef THIS_NAME
#define THIS_NAME() (this->Name())
#endif
#define FOO() ( DoSomthing(THIS_NAME) )

// "bodies.cc"
#define THIS_NAME() (ths->Name())
#include "FOO.h"
Re[2]: Возможен ли такой макрос
От: dynamic  
Дата: 25.09.09 08:41
Оценка:
Здравствуйте, Chorkov, Вы писали:

C>Вариант А:

C>
C>#define FOO() ( DoSomthing(strcmp(__FILE__, "bodies.cc") == 0 ? this->Name() : ths->Name() ) )
C>



C>Более разумный вариант:

C>
C>// FOO.h
C>#ifndef THIS_NAME
C>#define THIS_NAME() (this->Name())
C>#endif
C>#define FOO() ( DoSomthing(THIS_NAME) )
C>

C>
C>// "bodies.cc"
C>#define THIS_NAME() (ths->Name())
C>#include "FOO.h"
C>


Супер, здорово, спасибо большое.
Re[2]: Возможен ли такой макрос
От: dynamic  
Дата: 25.09.09 08:51
Оценка:

первый вариант у меня не заработал т.к есть видимость либо ths либо this, но не одновременно.
а второй у нас в проекте много bodies.cc и они добавляются постоянно тогда как я понимаю надо в каждый делать такое включение ?
хотелось бы написать и забыть может знаете еще рецептик
Re[3]: Возможен ли такой макрос
От: Chorkov Россия  
Дата: 25.09.09 09:41
Оценка: 3 (1) +1
Здравствуйте, dynamic, Вы писали:

D>

D>первый вариант у меня не заработал т.к есть видимость либо ths либо this, но не одновременно.

Можно сделать статическую функцию Name(). Тогда в контексте методов классов, где определен метод Name() будет вызыватсья метод класса, а в остельных случаях — глобальная функция. (Минусов у этого подхода тоже много. Чтобы не замусоривать глобальное пространство имен, можно придумать какое-то имя подлиннеее.)


Еще есть совсем "неправильный" прием с использованием ms-specifik (позволяет понять развертыватся ли макрос внутри члена класса лил нет):
#define FOO() \
    __if_exists(this)     ( DoSomthing(this->Name()) ) \
    __if_not_exists(this) ( DoSomthing(ths->Name()) )




D>а второй у нас в проекте много bodies.cc и они добавляются постоянно тогда как я понимаю надо в каждый делать такое включение ?

D>хотелось бы написать и забыть может знаете еще рецептик

Насколько я понимаю, если не определить THIS_NAME, то в bodies.cc будет ошибка компиляции.
Нужно просто рядом с определением FOO, написать развернутый коментарий...

Если проблема в том, что от контекста файла зависит более обного параметра шалбона и не хочется поддерживать их в большом числе файлов, то так:
// FOO.h
#ifdef AT_BODIES_CC
#define THIS_NAME() (ths->Name())
#define THIS_MORE() ...
#else
#define THIS_NAME() (this->Name())
#define THIS_MORE() ...
#endif
#define FOO() ( DoSomthing(THIS_NAME) )



Больше вариантов у меня нет.
Re[4]: Возможен ли такой макрос
От: dynamic  
Дата: 25.09.09 10:34
Оценка:
Здравствуйте, Chorkov, Вы писали:

C>Больше вариантов у меня нет.


Спасибо большое все очень здорово,
решили остановиться на том чтобы сделать дефайн в каждом bodies.cc
#define ths this

и везде вызывать как ths->Name();

как-то так
Re[5]: Возможен ли такой макрос
От: IROV..  
Дата: 25.09.09 17:12
Оценка: +1
Здравствуйте, dynamic, Вы писали:

Советую тебе расказать в чем собствено проблема ))) а то ты какойто кошмар генеришь
я не волшебник, я только учусь!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.