Как мне назвать структуру, используя переменную? - PullRequest
2 голосов
/ 04 июля 2011

Это должно быть просто, но я не могу понять это.Как назвать структуру, используя переменную, например ...

 char *QueryName = "GetAirports";   
 Query QueryName = malloc(sizeof(Query) + RecordCount*sizeof(int));

, где "Запрос" - это имя структуры.Спасибо за помощь.

Ответы [ 4 ]

1 голос
/ 04 июля 2011

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

1 голос
/ 04 июля 2011

Я предполагаю, что вы пытаетесь воссоздать то, что разрешено в более динамичных языках, таких как этот пример PHP:

$QueryName = "GetAirports";
$$QueryName = array(/*...*/);

Где, изменяя значение переменной $QueryName, вы можете ссылаться на другой объект?

Если так, простой ответ: вы не можете сделать это в C.

Однако вы можете использовать одну переменную, чтобы указывать на несколько экземпляров в разное время.

Query *query_ptr = &myFirstQueryObject;
query_ptr = &mySecondQueryObject;
/* etc */

Однако из вашего примера кода видно, что вы просто хотите выделить структуру? Если так:

typedef struct Query {
    /* fields here, e.g: */
    int id;
    int age;
} Query_t;

int main()
{
    Query_t *query = malloc(sizeof(Query_t));

    query->id = 1;
    query->age = 0;

    /* etc. */

    return 0;
}

Возможно, посмотрите на структуры C и указатели.

РЕДАКТИРОВАТЬ так что из дальнейших комментариев, очевидно, вы хотите создать карту с char* именем до Query объекта? Для этого есть несколько подходов, но самый простой - создать два массива:

char *names[];
Query *queries[];

Пока оба массива имеют одинаковое количество элементов, а * n * th элемент в names соответствует * n * th в queries, вы можете перебирать names, пока не найдете свое соответствие строка, затем используйте текущий индекс для разыменования соответствующего объекта в queries или наоборот

1 голос
/ 04 июля 2011

Я не уверен, что вижу необходимость использовать переменную.Почему бы просто не сделать:

Query GetAirports = malloc(sizeof(Query) + RecordCount*sizeof(int));
Query GetRunways = malloc(sizeof(Query) + RecordCount*sizeof(int));

Так как C является статически скомпилированным языком, имена объектов, такие как GetAirports и GetRunways здесь используются во время компиляции, но несуществует во время выполнения.Поэтому во время выполнения невозможно использовать содержимое строковой переменной для ссылки на объект по имени.

1 голос
/ 04 июля 2011

В C вы должны либо использовать ключевое слово struct, где вы используете struct типы, либо использовать typedef, например:

typedef struct query
{
  // ....
} query_t;

int main ()
{
  query_t *q = malloc (sizeof (query_t));
  return 0;
}
...