c препроцессор — C ++ # определите меня — & gt;

Я иду через источник старого приложения.
В этом коде я вижу много употреблений «мой».

Это было определено как

#define my  me ->

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

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

Спасибо!

Редактировать:

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

/*
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 ->

Но я все еще не вижу определения «я».

4

Решение

#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. Я настоятельно рекомендую не использовать его в своем коде.

7

Другие решения

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

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

me->Dog()

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

my Dog()
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
По вопросам рекламы [email protected]