我为phidgets C库制作了一个C ++包装器,目前对于通用Phidg​​et设备具有PhidgetDevice.h,这是标头:

#ifndef PHIDGET_DEVICE_H
#define PHIDGET_DEVICE_H

#include <phidget21.h>
#include <vector>
#include <iostream>
#include <string>


#define COMMON_IO_EVENT_CALLBACK(name) int CCONV name(CPhidgetHandle phid, void* userPtr)
#define ERROR_EVENT_CALLBACK(name) int CCONV name(CPhidgetHandle phid, void *userPtr, int errorCode, const char *errorString)

enum DeviceType
{
    DEVICE_NULL,
    DEVICE_KIT,
    DEVICE_TEMPERATURE_SENSOR,
    DEVICE_MOTION_SENSOR
};


class PhidgetDevice /* base class for every phidget device*/
{
public:
    PhidgetDevice() : m_type(DEVICE_NULL) {}
    explicit PhidgetDevice(DeviceType type) : m_type(type) {}
    void SetType(DeviceType type) { m_type = type; }

    virtual DeviceType GetType() { return m_type; }

    virtual void CCONV SetAttachHandler(CPhidgetHandle IFK, int(__stdcall * callback) (CPhidgetHandle phid, void *userPtr), void *userptr) { CPhidget_set_OnAttach_Handler(IFK, callback, userptr); }
    virtual void CCONV SetDetachHandler(CPhidgetHandle handle, int(__stdcall * callback) (CPhidgetHandle phid, void* userPtr), void * userptr) { CPhidget_set_OnDetach_Handler(handle, callback, userptr); }
    virtual void CCONV SetErrorHandler(CPhidgetHandle handle, int(__stdcall * callback) (CPhidgetHandle phid, void* userPtr, int errorCode, const char *errorString), void * userptr) { CPhidget_set_OnError_Handler(handle, callback, userptr); }
protected:
    DeviceType m_type;
};
#endif


这使凌乱的C Phidg​​et函数看起来好很多。
现在,这在Visual Studio 2013上可以正常编译,但是当我尝试使用g ++ 4.8包括-std=c++11进行编译时,我得到:


  Phidg​​etDevice.h:34:72:错误:“ *”令牌虚拟之前的预期“)”
  无效CCONV SetAttachHandler(CPhidg​​etHandle IFK,int(__ stdcall *
  回调)(CPhidg​​etHandle phid,void * userPtr),void * userptr){
  CPhidg​​et_set_OnAttach_Handler(IFK,回调,userptr); }


还有更多,所有这些都抱怨函数指针。

我的函数指针有什么问题?

最佳答案

您的函数指针定义很好,正是__stdcall关键字引起了gcc问题。 __stdcall关键字定义了编译器将为其指定功能使用的调用约定;具体来说,__stdcall本身(双下划线然后是stdcall措辞)是用于调用约定的MS特定关键字,如果您希望使用gcc维护它,则可以执行以下操作:

#ifndef WIN32
    #ifndef __stdcall
        #define __stdcall __attribute__((stdcall))
    #endif
#endif


尽管您可能会发现它在很大程度上会被编译器忽略(作为gcc警告:warning: 'stdcall' attribute ignored)。

关于c++ - Phidg​​ets包装器不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28053363/

10-11 18:06