что не так с приведенным ниже типизацией кода c - PullRequest
0 голосов
/ 17 января 2012

У меня есть этот код

if (hashtable_count(h) > 0)
    {
      do {
          kk = (key*)hashtable_iterator_key(itr);
          v =(value*) hashtable_iterator_value(itr);
....

ключ и значение оба объявлены в том же блоке кода, что и

 struct key *k, *kk;
struct value *v;

и VC 2010 сообщает о следующей ошибке

ошибка C2065: «ключ»: необъявленный идентификатор

ошибка C2059: синтаксическая ошибка: ')'

ошибка C2065: 'значение': необъявленный идентификатор

ошибка C2059: синтаксическая ошибка: ')'

ошибки для двух строк назначения. Две первые ошибки относятся к первому оператору присваивания, а следующие - к последнему.

Я буду рад предоставить более подробную информацию, если потребуется.

Дополнительная информация: Вот две функции

 void * hashtable_iterator_key(struct hashtable_itr *i)
  { return i->e->k; }

void * hashtable_iterator_value(struct hashtable_itr *i)
  { return i->e->v; }

Если я не наберу приведение возвращенного значения к ключу *, он сообщит об ошибке несоответствия типов

Ответы [ 3 ]

1 голос
/ 17 января 2012

struct key *, value*; ничего не декларирует. Это даже не верно C.

Если вы хотите сделать предварительное объявление, синтаксис следующий:

struct key;
struct value;

Тем не менее, вы уверены, что не должны заменять key и value каким-либо пользовательским типом? Часто структуры данных в C имеют void * для подобных полей, поэтому вы можете поместить в них любой указатель и затем привести их к вашим собственным структурам.

1 голос
/ 17 января 2012

(ключ *) в вашем касте должен быть (структурный ключ *)

Вы не создали тип "ключ".

т.е. Вы не сделали:

typedef struct
{
   <some defines>
} key;

Тогда (ключ *) будет работать.

0 голосов
/ 17 января 2012

Похоже, что компилятор не знает о типе "ключ" и "значение".Вы уверены, что сделали правильно включает?

...