我正在开发一个包含Win32的mixerXXX
API函数的小型OOP / RAII库。
我正在编写一个封装MIXERLINE
结构的类,因此我的MixerLine
类将其作为标题:
#pragma once
#define UNICODE
#include <stdio.h>
#include <string>
#include <windows.h>
#include "MixerDevice.h"
//////////////////////////////
class MixerLine {
private:
MIXERLINE _mixerLine;
public:
MixerLine(MixerDevice& parentMixer, DWORD destinationIndex);
~MixerLine();
};
但是我收到语法错误(在VC9中):
错误2错误C2061:语法错误:标识符'MixerDevice'd:\ tfs \ misc \ winwavein \ mixerline.h
为什么信息不是更有用?我不知道它有什么问题。
FWIW,文件MixerDevice.h
中根本没有错误。
编辑:以下是原始的整个文件:
MixerLine.h
#pragma once
#define UNICODE
#include <stdio.h>
#include <string>
#include <windows.h>
#include "MixerDevice.h"
//////////////////////////////
class MixerLine {
private:
MIXERLINE _mixerLine;
public:
MixerLine(MixerDevice& parentMixer, DWORD destinationIndex);
~MixerLine();
// Properties
DWORD getDestinationLineIndex() {
return _mixerLine.dwDestination;
}
DWORD getSourceIndex() {
return _mixerLine.dwSource;
}
DWORD getLineId() {
return _mixerLine.dwLineID;
}
DWORD getStatus() {
return _mixerLine.fdwLine;
}
std:wstring getStatusString() {
switch( _mixerLine.fdwLine ) {
case MIXERLINE_LINEF_ACTIVE:
return L"MIXERLINE_LINEF_ACTIVE";
case MIXERLINE_LINEF_DISCONNECTED:
return L"MIXERLINE_LINEF_DISCONNECTED";
case MIXERLINE_LINEF_SOURCE:
return L"MIXERLINE_LINEF_SOURCE";
default:
return L"";
}
}
DWORD getUserData() {
return _mixerLine.dwUser;
}
DWORD getComponentType() {
return _mixerLine.dwComponentType;
}
};
MixerDevice.h
#pragma once
#define UNICODE
#include <memory>
#include <stdio.h>
#include <iostream>
#include <vector>
#include <windows.h>
////////////////////////
#include "MixerLine.h"
class MixerDevice {
private:
DWORD _deviceId;
HMIXER _mixerHandle;
MIXERCAPS _mixerCaps;
public:
MixerDevice(DWORD deviceId);
~MixerDevice();
void enumerateLines();
// Properties
DWORD getDeviceId() {
return _deviceId;
}
HMIXEROBJ getHandle() {
return (HMIXEROBJ)_mixerHandle;
}
// Caps
WORD getManufacturerId() {
return _mixerCaps.wMid;
}
WORD getProductId() {
return _mixerCaps.wPid;
}
MMVERSION getDriverVersion() {
return _mixerCaps.vDriverVersion;
}
WCHAR* getProductName() {
return _mixerCaps.szPname;
}
DWORD getSupportBits() {
return _mixerCaps.fdwSupport;
}
DWORD getDestinationCount() {
return _mixerCaps.cDestinations;
}
};
MixerDevice.cpp(我正在尝试编译的文件):
#include "MixerDevice.h"
using namespace std;
MixerDevice::MixerDevice(DWORD deviceId) {
_deviceId = deviceId;
MMRESULT result;
result = mixerOpen( &_mixerHandle, deviceId, NULL, NULL, MIXER_OBJECTF_MIXER );
if( result != MMSYSERR_NOERROR ) throw new exception("Call to mixerOpen failed.", result);
result = mixerGetDevCaps( (UINT)_mixerHandle, &_mixerCaps, sizeof(MIXERCAPS) );
if( result != MMSYSERR_NOERROR ) throw new exception("Call to mixerGetDevCaps failed.", result);
}
MixerDevice::~MixerDevice() {
MMRESULT result = mixerClose( _mixerHandle );
if( result != MMSYSERR_NOERROR ) exit(666);
}
// Methods
void MixerDevice::enumerateLines() {
}
答案 0 :(得分:2)
您的代码中包含循环包含,难怪它不起作用。您需要在标题中替换包含前向声明的包含。
MixerLine.h - 用前向声明替换include:
//#include "MixerDevice.h"
class MixerDevice;
并将实现移至实现文件。
答案 1 :(得分:2)
正如Luchian Grigore已经说过的那样,如果前向声明足以包括整个标题(至少在这里和恕我直言),那么它就更好了。
#pragma once
对圆形内含物没有帮助,它只能避免无限包含._
但是包含是从MixerDevice.cpp
开始的:
MixerDevice.cpp - #include
- &gt; MixerDevice.h - #include
- &gt; MixerLine.h - #include
- &gt; MixerDevice.h
由于#include
中的#pragma once
,最后MixerDevice.h
指令无效。预处理器组装一个看起来像的文档(翻译单元)(使用/P
或/showIncludes
来查看):
这是编译器有效接收的输入。现在,当编译器到达MixerLine.h
:
MixerLine(MixerDevice& parentMixer, DWORD destinationIndex);
名称MixerDevice
尚未知晓;该名称在MixerDevice.h
内容的文档“下方”中引入。在使用其名称之前,您至少需要声明类MixerDevice
。您也可以更改包含顺序,因为MixerDevice
目前不依赖MixerLine
,但您可能会在此后遇到更多麻烦。
在与Luchian Grigore讨论后,我想指出:
不要通过反转包含顺序来解决问题,此解决方案仅适用于此特定情况,并且仅在MixerDevice.h
中未提及仅在{{1 }}。正如Luchian Grigore所提到的,使用前向声明。