незаконное использование этого типа в качестве выражения (ошибка) C

#c #types

#c #типы

Вопрос:

Самый последний файл, который я добавил в свой проект VC 2010, внезапно выдает мне ошибки о типах данных. После небольшого поиска эта ошибка кажется распространенной в коде C, но я использую C (и да, расширение моего файла правильное). Мой класс BUFFER по-прежнему отлично работает во всех других моих файлах, и если я их закомментирую, он выдает те же ошибки и для типов Windows UINT.

Кстати, это из «DRONEPOOL.h»

мой код:

 //#include <winsock2.h>
//#include <ws2tcpip.h>
#include <Windows.h>
#include "BUFFER.h"

#ifndef __DRONEPOOL_H__
#define __DRONEPOOL_H__

#define DRONE_POOL_SIZE 100

#define DRONESTATE_EMPTY   0
#define DRONESTATE_IDLE    1
#define DRONESTATE_WORKING 2
#define DRONESTATE_PICKUP  3   // work result ready for pickup

#define LPCLIENTCONNECTION CLIENTCONNECTION*
struct CLIENTCONNECTION
{
//  SOCKET skSocket;
    WORD   wState;
};


#define LPDRONEPOOL DRONEPOOL*
class DRONEPOOL
{
pritave:
    BUFFER bfTaskBuffer;
    BUFFER bfResultBuffer;
    CLIENTCONNECTION ccPool[DRONE_POOL_SIZE];
    UINT iPoolHead;
    UINT iPoolTail;
    HANDLE hPoolMutex;
    HANDLE hManagerThread;
    static DWORD WINAPI Manager(__in LPVOID);
public:
    DRONEPOOL();
    ~DRONEPOOL();
    BOOL InsertDrone(SOCKET);
    BOOL AssignTask(LPXMSG);
    BOOL PeekResult(LPXMSG);
    BOOL GetResult(LPXMSG);
};

#endif
  

Ошибка заключается в следующем: ОШИБКА C2275: ‘BUFFER’: незаконное использование этого типа в качестве выражения

Есть идеи, как решить эту проблему?

Комментарии:

1. не могли бы вы указать, какая строка выдает ошибку?

2. Когда вы говорите #define LPCLIENTCONNECTION CLIENTCONNECTION* , не имеете ли вы в виду typedef LPCLIENTCONNECTION CLIENTCONNECTION*;

3. В C и C есть это замечательное ключевое слово typedef . Не используйте макросы для объявления имен типов указателей.

4. @karl: Это наоборот.

5. Вы не должны использовать зарезервированные имена для защиты включения — удалите подчеркивания с самого начала.

Ответ №1:

Скорее всего, ошибка в написании private вводит компилятор в заблуждение в следующей строке, где объявлен ваш BUFFER bfTaskBuffer .

РЕДАКТИРОВАТЬ: Также несколько комментариев о коде и стиле:

  • Двойные подчеркивания зарезервированы в любом контексте, а начальные подчеркивания — это некоторые контексты (за которыми следует заглавная буква или в глобальном пространстве имен, возможно, другие). Просто используйте DRONEPOOL_H .
  • Обычно все заглавные буквы зарезервированы для констант. Рассмотрим Dronepool вместо DRONEPOOL .
  • Вместо использования #define псевдонима указателя используйте typedef: После определения класса do typedef DRONEPOOL* LPDRONEPOOL; , которое создает псевдоним типа, а не замену текста.

Комментарии:

1. Не видел, чтобы ваш ответ лежал там. Да, у него опечатка: pritave

2. rotfl, можно подумать, что они могли бы выдать сообщение об ошибке для этого XD

3. Как компилятор узнает, что вы неправильно написали ключевое слово, и это не просто неразрешенный тип?

4. @Mark Ingram Я бы предположил, исходя из того, как он используется в синтаксисе контроллера области видимости

5. @Mark B: здесь более уместно, он также используется для битовых полей в определениях классов.