头文件中缺少typedef会导致编译错误

时间:2015-12-23 09:28:48

标签: c++ typedef

我有一个头文件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没有typedef - 长篇故事 - 但是使用的其他文件可能包含了Windows.h或者具有typedef'dBTE的东西。

但是我有这个课我需要#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

定义修复有效,编译和链接时没有任何问题。但这是最好的方法吗?我还有其他选择吗?

1 个答案:

答案 0 :(得分:0)

好像你正在使用的某些标题是#define BYTE <something>,这是一件相当不友好的事情。

您可以尝试找出是否可以删除或禁用#define(某些Windows标题允许您有选择地关闭部分内容)。

否则,您的解决方案是应对恶劣环境的合理方式。另一种选择是

#undef BYTE
typedef unsigned char       BYTE;