Как я могу получить информацию о вызывающей функции в C? - PullRequest
1 голос
/ 21 января 2010

У меня есть функция, void funct (struct *B). Это будет вызываться в некоторых случаях struct A. Требуется только указатель на распорку B и модифицировать этот экземпляр структуры B. Если структура A имеет char *name. У меня вопрос, могу ли я получить доступ к A_instance->name? в funct? Если да, то как? Спасибо

Ответы [ 4 ]

3 голосов
/ 21 января 2010

Вы говорите, что это C, который пропускает функции-члены (C не имеет функций-членов, классов и т. Д.). Это означает, что функция - это просто функция (не элемент чего-либо), и поэтому у вас есть только информация, которая передается, и глобальные переменные. Поскольку ни одна из этих вещей не содержит того, что вы хотите, вы не можете получить это.

Однако вы также говорите, что функция вызывается «некоторыми экземплярами структуры A». Это не имеет никакого смысла, потому что в структурах C нет функций-членов, и поэтому они не могут выполнять вызовы. Либо вы имеете в виду, что операции над некоторыми экземплярами структуры A вызывают funct (в этом случае применяется мой первый ответ), либо вы действительно работаете с C ++, и у вас есть функции-члены в структуре A.

Если funct является функцией-членом структуры A, то funct имеет полный доступ ко всем членам экземпляра A, вызвавшего его, и поэтому может напрямую проверять «имя». В противном случае мы вернемся к моему первому ответу.

Чтобы исправить это, вам либо понадобится функция, чтобы быть функцией-членом структуры A (тем самым перейдя к C ++), либо вам нужно будет передать соответствующую информацию в функцию.

0 голосов
/ 21 января 2010

Если у вас есть такая программа:

struct B {
  int dummy;
}

struct A {
  char *name;
  struct B* b;
}

void funcA ( struct A* a ) {
   funcB ( a->b );
}

void funcB ( struct B* b ) {
   /* do something */
}

, и вы хотите узнать что-то о a в funcB, нет подходящего способа сделать это. может попытаться сделать, используя арифметику указателей или индексы отрицательных массивов, чтобы угадать расположение a в стеке, что может даже работать с данным компилятором данная платформа. Если вы сделаете так, пожалуйста, не забудьте опубликовать решение для The Daily WTF .

0 голосов
/ 21 января 2010

Боюсь, C не разрешает вам доступ к данным вызывающих функций. Проще всего было бы просто передать указатель на "struct A", по крайней мере, тогда у вас всегда будет доступ к A.

void func(struct B* b_ptr, struct A* a_ptr) 
{
    /* ... */
    /* do whatever you like with a_ptr->name */

}
0 голосов
/ 21 января 2010

Звучит так, будто вы пытаетесь написать функцию, которая должна обрабатывать значение name, которое присутствует в двух разных структурах: struct A и struct A. Если это так, то почему бы не взять char* непосредственно в функции и не дать звонящим пройти соответствующее поле name?

funct(char * name) { 
  ..
}

funct(aInstance->name);
funct(bInstance->name);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...