#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: После определения класса dotypedef DRONEPOOL* LPDRONEPOOL;
, которое создает псевдоним типа, а не замену текста.
Комментарии:
1. Не видел, чтобы ваш ответ лежал там. Да, у него опечатка:
pritave
2. rotfl, можно подумать, что они могли бы выдать сообщение об ошибке для этого XD
3. Как компилятор узнает, что вы неправильно написали ключевое слово, и это не просто неразрешенный тип?
4. @Mark Ingram Я бы предположил, исходя из того, как он используется в синтаксисе контроллера области видимости
5. @Mark B: здесь более уместно, он также используется для битовых полей в определениях классов.