2015-12-23 55 views
0

我有一個頭文件monitor.hpp:在頭文件丟失引起的typedef編譯錯誤

#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_ 

上面公告不存在的typedef爲BYTE - 漫長的故事 - 也許使用了包括Windows,但其他文件.h或者可能會有typedef'd BYTE的東西。

但後來我有這個類,我需要#包括該頭文件:

#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;