Странная ошибка в `typedef struct` в Visual C ++ 6.0 - PullRequest
1 голос
/ 29 июня 2011

Я пытаюсь скомпилировать простую программу на C в MSVC 6.0, которая имеет следующее:

typedef struct _unitID {
    int sock;           // socket
    unsigned long au;    // the AU ID
} unitID;

Однако компилятор вызывает странную ошибку:

error C 2085: 'unitID' not in formal parameter list

I 'я не уверен, что понимаю, на что жалуется компилятор, поскольку согласно собственной странице microsoft об ошибке это означает "Идентификатор был объявлен в определении функции, но не в списке формальных параметров."

Учитывая, что вышеприведенный фрагмент составляет весь заголовок, и что в файле нет функции, как я могу заставить это успешно скомпилироваться?

[РЕДАКТИРОВАТЬ - РАЗРЕШЕНО]: Из-за каскадной ошибки из-за определения типа, объявленного в файле включения до этого.

1 Ответ

0 голосов
/ 29 июня 2011

Проблема:

Проблема вызвана typedef, объявленным во включающем файле:

Файл [main.c]:

#include <glib.h>
//...
#if (!GLIB_CHECK_VERSION(2,11,0))
typedef pid_t GPid;
#endif
//...
#include "someheader.h"
//...

Файл [someheader.h]:

#include <stdio.h>
#include "unitid.h"
//...

Файл [unitid.h]:

typedef struct _unitID {
    int sock;           // socket
    unsigned long au;    // the AU ID
} unitID;

Ошибка с первой версией typedef полностью переходит в unitid.h, вызывая странное поведение.Поскольку мы создаем более старую версию Glib, typedef вызывает ошибку.

Решение

Решение состояло в том, чтобы добавить проверку платформы для обработки различий в том, как эти две платформы работают сPID, как видно из [main.c]:

//...
#if (!GLIB_CHECK_VERSION(2,11,0))
#ifdef WIN32
  typedef void* GPid;
#else
  typedef int GPId;
#endif
#endif
//...
...