2015-12-23 3 views
0

У меня есть заголовочный файл monitor.hpp с:отсутствует ЬурейеЕ в заголовочном файле причины ошибка компиляции

#ifndef MONITOR_HPP_ 
#define MONITOR_HPP_ 

typedef unsigned short abc_status_id_t; 

struct monitor_update 
{ 
    monitor_update(BYTE* data, size_t size) { /* implementation */ } 
    BYTE* data; 
    size_t dataSize; 
}; 

class monitor_consumer 
{ 
public: 
    virtual ~monitor_consumer() {}; 
    virtual void updated(const monitor_update& update) = 0; 
}; 

#endif // MONITOR_HPP_ 

Уведомление выше, что нет ЬурейеЕ для BYTE - длинная история - но другие файлы, используя, возможно, включили Windows, .h или что-то, что бы typedef'd BYTE.

Но тогда у меня есть этот класс, где мне нужно #include файл заголовка:

#ifndef BYTE 
typedef unsigned char  BYTE; 
#endif 

#include "monitor.hpp" 

class mymonitor : public monitor_consumer 
{ 
public: 
    void updated(const monitor_update& update) { } 
}; 

int main() { 

} 

Если я закомментируйте #ifndef BYTE тогда я получаю:

monitor.hpp(9): error C2061: syntax error : identifier 'BYTE' 
monitor.hpp(10): error C2143: syntax error : missing ';' before '*' 
monitor.hpp(10): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 

Определить починки работы и у меня нет проблем с компиляцией и связыванием. Но это лучший подход. Какие у меня есть другие варианты?

+0

Другие файлы, возможно, определили BYTE, но они не включены в файл monitor.hpp. Это вызовет проблему – Amir

+1

Используйте 'std :: uint8_t'. Решаемые. – LogicStuff

+0

В коде есть концептуальная проблема, и это может стать причиной путаницы. typedef - это директива компилятора, а #ifndef - пред-компиляторная директива. Typedef всегда выходит за рамки предварительного компилятора –

ответ

0

Кажется, что некоторые из заголовков, которые вы используете, делают #define BYTE <something>, что является довольно недружелюбной вещью.

Вы можете попытаться выяснить, возможно ли удалить или отключить этот #define (некоторые заголовки Windows позволяют выборочно отключать их части).

В противном случае ваше решение является разумным способом справиться с враждебной средой. Альтернативным вариантом будет

#undef BYTE 
typedef unsigned char  BYTE; 
Смежные вопросы