2013-11-30 1 views
4

Я просматриваю источник старого приложения. В этом коде я вижу много использования «мой».C++ #define my me ->

Он был определен как

#define my me -> 

Но я не уверен, что exactely это значит. Означает ли это, что если я использую «мой», он будет использовать «this->»?

Я знаю, что это не очень хорошая практика, но мне нужно понять, что она делает.

Спасибо!

Edit:

Вот больше информации от автора:

/* 
    Use the macros 'I' and 'thou' for objects in the formal parameter lists 
    (if the explicit type cannot be used). 
    Use the macros 'iam' and 'thouart' 
    as the first declaration in a function definition. 
    After this, the object 'me' or 'thee' has the right class (for the compiler), 
    so that you can use the macros 'my' and 'thy' to refer to members. 
    Example: int Person_getAge (I) { iam (Person); return my age; } 
*/ 
#define I Any void_me 
#define thou Any void_thee 
#define iam(klas) klas me = (klas) void_me 
#define thouart(klas) klas thee = (klas) void_thee 
#define my me -> 
#define thy thee -> 
#define his him -> 

Но я до сих пор не может видеть определение "я".

+3

Что там у вас не определяет 'me'. Он определяет 'my'. (И это ужасно.) – Mat

+2

Что бы это ни было, я бы не стал его использовать .... –

+3

Держу пари, что там '#define me this 'где-то еще. Я бы удалил все это (замените злые макросы нормальным кодом), если сможете. –

ответ

7

#define очень проста в этом вопросе: когда вы используете my в коде, он будет замещен me ->, поэтому такой код

struct X { 
    char first_name[100]; 
    char last_name[100]; 
    int age; 
} *me; 

me = malloc(sizeof(struct X)); 
strcpy(my first_name, "John"); 
strcpy(my last_name, "John"); 
my age = 23; 

будет фактически означать

strcpy(me->first_name, "John"); 
strcpy(me->last_name, "John"); 
me->age = 23; 

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

+0

Я добавил дополнительную информацию в сообщение, возможно, это делает ее более понятной. – tmighty

+0

@tmighty Ничего себе! Я думал, что это '# define' было странным, но другие' # define 'просто злы! – dasblinkenlight

+0

Нет ничего злого в таких вещах. Использование препроцессора для определения нового языка поверх оригинала совершенно нормально и более или менее полнота того, что он делает. Это озадачивает, когда рассматривается как C, но это не то, что есть: это собственный пользовательский язык автора, основанный на C *. Препроцессор - отличный и удобный инструмент для игры в таких дизайнерских помещениях. – Leushenko

0

если вы будете использовать my, вы будете использовать me ->.

это даст вам ошибку, если только me не определен, если используется my.

class B { 
public: 
    void f() {} 
}; 


#define my me -> 
int main(int argc, char** argv) { 

    B* b = new B(); 
    b my f(); // error, expanded to: b me -> f() 
    B* me = new B(); 
    my f(); // OK, expanded to: me -> f() 
    delete b; 
    delete me; 
    return 0; 
} 

но:

#define me 
#define my me -> 
int main(int argc, char** argv) { 
    B* b = new B(); 
    b my f(); // OK, expanded to: b -> f(); 
    delete b; 
    return 0; 
} 
0

Это макрос, который делает my псевдоним для me ->.

Предпочитаемое использование должно быть таким, чтобы разрешить использование my x для любого члена x при условии, что me является указателем на какой-либо объект. Таким образом, эти два будут эквивалентны, учитывая, что макрос:

me->x 
my x 

Скорее всего, у вас есть макрос, как это, где-то в коде:

#define me this 

, который позволил бы использовать me вместо this в функции-члене.Планируемый эффект так, что в любой функции-члена класса с членом x, эти два эквивалентны:

my x 
this->x 

и это однозначно относятся к элементу x текущего экземпляра, даже если локальная переменная с одно и то же имя существует - потому что это то, что this->x.

Это, этот трюк ужасно. Он не добавляет ничего, чего еще нет в языке - он создает только новый синтаксис для чего-то, у которого уже есть четко определенный и хорошо известный синтаксис.

Кроме того, благодаря тому, что он является макросом, он очень легко сломает совершенно правильный код. Например, как только кто-то пытается объявить переменную типа int называется my, этот макрос может привести к очень запутанных сообщений об ошибках, так как фактический код генерируемый:

// This is what is written: 
int my; 
// This is what it becomes: 
int me ->; 
// Unless the #define for me is available, in which case you get: 
int this -> 

Мой совет, и, кажется, с другой комментарии, как будто существует сильный консенсус: Избегайте этого макроса и, если возможно, удаляйте его и заменяйте все его использования обычным доступом к члену.

Единственная причина, которую я мог думать, чтобы иметь такой макрос будет в переводе слоя на какой-либо другой язык, в котором me фактически означает то же самое, как this в C++ и my такое же, как this ->. Поэтому, если это не часть небольшого слоя перевода языка, используемого поверх компилятора C++, его необходимо удалить.

0

Компилятор заменит экземпляры «my» на «me ->» при компиляции.

Предположительно, целью является разыменование указателя под названием «я». то есть, если объект указывает на есть метод Dog(), вместо

me->Dog() 

вы можете просто использовать

my Dog() 

 Смежные вопросы

  • Нет связанных вопросов^_^