[英]“error: C2275: 'QMouseEvent' : illegal use of this type as an expression”
[英]Compiler error C2275
我在Visual Studio 2010中編寫了一個簡單的WinSock應用程序。我將我的應用程序入口點命名為“main.c”,然后在聲明SOCKET對象時遇到了這個錯誤:
error C2275: 'SOCKET' : illegal use of this type as an expression
奇怪的是,我通過將代碼文件從main.c重命名為main.cpp來解決了這個問題
出於好奇,我想知道這個錯誤的含義是什么,以及通過更改擴展名會產生什么差異。
提前致謝。
編輯
這是相關代碼:
#pragma comment(lib,"ws2_32")
#include <WinSock2.h>
#include <stdio.h>
int main()
{
// Startup the winsock
WORD wVersionRequested;
WSADATA wsaData;
int wsaerr;
wVersionRequested = MAKEWORD(2,2);
wsaerr = WSAStartup(wVersionRequested,&wsaData);
if(wsaerr != 0)
{
printf("Winsock2 dll is not found!\n");
WSACleanup();
return 0;
}
else
{
printf("Winsock2 dll is found!\n");
printf("Current System Status: %s.\n",wsaData.szSystemStatus);
}
//Create a SOCKET object called socketobj.
SOCKET socketobj;
socketobj = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (socketobj == INVALID_SOCKET)
{
printf("Socket Intialization Failed with error: %ld\n", WSAGetLastError());
WSACleanup();
return 0;
}
else
{
printf("Socket Intialization Success\n");
}
Sleep(10000);
return 0;
}
沒有看到代碼,很難說。
但我的猜測是你有一些交錯的聲明和代碼。 MSVC的C編譯器只是C89,它不支持它。 這可以解釋為什么C ++編譯器接受它,但C編譯器不接受它。
在C99之前,所有聲明必須位於函數或塊的開頭。
編輯:您的代碼沒有顯示整個函數,但您可能在SOCKET socketobj;
之前有一些(非聲明)代碼SOCKET socketobj;
宣言。
現在顯示了完整的功能,它確認您正在交錯聲明和代碼:
WORD wVersionRequested; // Declaration: ok
WSADATA wsaData; // Declaration: ok
int wsaerr; // Declaration: ok
wVersionRequested = MAKEWORD(2,2); // Code: ok
...
SOCKET socketobj; // Declaration: NOT ok
socketobj = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
這里的解決方案是移動SOCKET socketobj;
與其他聲明一起使用函數的開頭。
C和C ++之間存在差異。 例如,在C89中,您不能在代碼塊的中間聲明變量,而只能在開頭聲明。
看一下錯誤描述: http : //msdn.microsoft.com/en-us/library/76c9k4ah%28v=vs.71%29.aspx
通過將擴展名更改為.cpp Visual Studio使用C ++編譯器而不是C編譯器(這是一種完全不同的語言)。
所以你可能編寫了C ++代碼並將其輸入到C編譯器中,這恰好導致了錯誤的拋出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.