VC++ 7.0 -проблемы с компиляцией стандартного Си кода
От: morning_wind  
Дата: 23.12.06 07:05
Оценка:
Здравствуйте!
при компиляции библиотеки Net2(здесь) в Visual Studio 7.0 возникает ошибки такого рода:

net2sets.c(61): error C2054: expected '(' to follow 'IP'

код, в котором ошибка:
SETCODE(, IP, IPaddress, 10, ipEqual(a, b));

SETCODE определена в файле set.h следующим образом(простите, что весь файл засунула, но никак не могу выделить то, что нужно, потому что странный макрос там):

#define SETTYPE(NAME, TYPE)  \
typedef struct  \
{  \
  int itr;  \
  int last;  \
  int size;  \
  TYPE *set;  \
} NAME##Set;

#define SETFORWARD(MODIFIER, NAME, TYPE)  \
  \
MODIFIER int init##NAME##Set(NAME##Set *s, int size);  \
MODIFIER void finit##NAME##Set(NAME##Set *s);  \
MODIFIER int member##NAME##Set(NAME##Set *s, TYPE *v);  \
MODIFIER TYPE *item##NAME##Set(NAME##Set *s, TYPE *v);  \
MODIFIER int add##NAME##Set(NAME##Set *s, TYPE *v);  \
MODIFIER int del##NAME##Set(NAME##Set *s, TYPE *v);  \
MODIFIER int first##NAME##Set(NAME##Set *s, TYPE *v);  \
MODIFIER int next##NAME##Set(NAME##Set *s, TYPE *v);  \

#define SETCODE(MODIFIER, NAME, TYPE, INCREMENT, TESTEQ)  \
  \
MODIFIER int init##NAME##Set(NAME##Set *s, int size)  \
{  \
  s->itr = 0;  \
  s->last = 0;  \
  s->size = size;  \
  s->set = malloc(size * sizeof(TYPE));  \
  if (NULL == s->set)  \
  {  \
    return -1;  \
  }  \
  \
  return 0;  \
}  \
  \
MODIFIER void finit##NAME##Set(NAME##Set *s)  \
{  \
  s->itr = 0;  \
  s->last = 0;  \
  s->size = 0;  \
  if (NULL != s->set)  \
  {  \
    free(s->set);  \
  }  \
  s->set = NULL;  \
}  \
  \
MODIFIER int member##NAME##Set(NAME##Set *s, TYPE *v)  \
{  \
  int i;  \
  for (i = 0; i < s->last; i++)  \
  {  \
    TYPE *a = v;  \
    TYPE *b = &(s->set[i]);  \
    if (TESTEQ)  \
    {  \
      return i;  \
    }  \
  }  \
  return -1;  \
}  \
  \
  \
MODIFIER TYPE *item##NAME##Set(NAME##Set *s, TYPE *v)  \
{  \
  int index = member##NAME##Set(s, v);  \
  if (-1 != index)  \
  {  \
    return &(s->set[index]);  \
  }  \
  \
  return NULL;  \
}  \
  \
MODIFIER int add##NAME##Set(NAME##Set *s, TYPE *v)  \
{  \
  TYPE *nset = NULL;  \
  int nsize = 0;  \
  int i;  \
  \
  if (-1 != member##NAME##Set(s, v))  \
  {  \
    return 0;  \
  }  \
  \
  if (s->last < s->size)  \
  {  \
    s->set[s->last] = *v;  \
    s->last++;  \
  \
    return 0;  \
  }  \
  \
  nsize = s->size + INCREMENT;  \
  nset = malloc(nsize * sizeof(TYPE));  \
  if (NULL == nset)  \
  {  \
    return -1;  \
  }  \
  \
  for (i = 0; i < s->last; i++)  \
  {  \
    nset[i] = s->set[i];  \
  }  \
  \
  free(s->set);  \
  s->set = nset;  \
  s->size = nsize;  \
  \
  return add##NAME##Set(s, v);  \
}  \
  \
MODIFIER int del##NAME##Set(NAME##Set *s, TYPE *v)  \
{  \
  int index = member##NAME##Set(s, v);  \
  if (-1 != index)  \
  {  \
    (s->last)--;  \
    s->set[index] = s->set[s->last];  \
    return 0;  \
  }  \
  \
  return -1;  \
}  \
  \
MODIFIER int first##NAME##Set(NAME##Set *s, TYPE *v)  \
{  \
  s->itr = 0;  \
  if (s->itr < s->last)  \
  {  \
    *v = s->set[s->itr];  \
    return 0;  \
  }  \
  \
  return -1;  \
}  \
  \
MODIFIER int next##NAME##Set(NAME##Set *s, TYPE *v)  \
{  \
  (s->itr)++;  \
  if (s->itr < s->last)  \
  {  \
    *v = s->set[s->itr];  \
    return 0;  \
  }  \
  \
  return -1;  \
}

#endif


написала разработчику по этому поводу. он говорит, что либо я код изменила(и это вызвало ошибки), либо проблемы с компилятором Visual C++ 7.0.
код я и правда изменила. но чуть-чуть.
просто компилятор ругался(set.cpp(40): error C4716: 'SDL_main' : must return a value)
), что следующая функция ничего не возвращает:

int main(int argc, char **argv)
{
  int i;
  int j;
  SocketSet s;

  initSocketSet(&s, 100);

  for (i = 0; i < 1000; i++)
  {
    addSocketSet(&s, &i);
  }

  for (i = 0; i < 1000; i += 2)
  {
    delSocketSet(&s, &i);
  }

  for (j = firstSocketSet(&s, &i); 
       j != -1;
       j = nextSocketSet(&s, &i))
  {
    printf("item = %d\n", i);
  }

  finitSocketSet(&s);
 }


и я приписала в конце "return 0;" но не думаю, что это столь серьезное изменение...
Другими компиляторами код компилируется нормально. код удовлетворяет стандартам. Неужели проблема с VC++ 7.0? или все-таки я чего-то натворила?

Буду благодарна за любую помощь.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.