Assigning to “MyPrivateData *” from incompatible type 'void *' error in cocoa project
-
12-06-2021 - |
Question
I'm trying to implement the USBPrivateDataSample in my cocoa project. The problem is when I'm trying to allocate memory for the struct MyPrivateData I get the error
"Assining to "MyPrivateData *" from incombatible type 'void *'"
I have the struct definition in my header file:
#define kMyVendorID 0x0403
#define kMyProductID 0x6001
class RtMidiOut;
typedef struct MyPrivateData {
io_object_t notification;
IOUSBDeviceInterface **deviceInterface;
CFStringRef deviceName;
UInt32 locationID;
} MyPrivateData;
static IONotificationPortRef gNotifyPort;
static io_iterator_t gAddedIter;
static CFRunLoopRef gRunLoop;
@interface serialInput : NSObject{
...
And I'm calling in my .mm file:
void DeviceAdded(void *refCon, io_iterator_t iterator){
kern_return_t kr;
io_service_t usbDevice;
IOCFPlugInInterface **plugInInterface = NULL;
SInt32 score;
HRESULT res;
while ((usbDevice = IOIteratorNext(iterator))) {
io_name_t deviceName;
CFStringRef deviceNameAsCFString;
MyPrivateData *privateDataRef;
UInt32 locationID;
printf("Device added.\n");
// Add some app-specific information about this device.
// Create a buffer to hold the data.
privateDataRef = malloc(sizeof(MyPrivateData)); //The error!
bzero(privateDataRef, sizeof(MyPrivateData));
Any useful advice?
Solution
The suffix mm means you are using C++ code and Objective-C code. Although Objective-C is a superset op C, the compiler will allow it. But you have to keep in mind that C++ is not a superset of C. The same rules don't apply.
While C allows you to do implicit casts from
void *
to an other data type, C++ requires you to do an explicit cast.
E.g.:
char *a;
void *b;
a = b; // allowed in C, not in C++
a = (char *)b; // allowed in C, required in C++
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow