我一直在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;
}
答案 0 :(得分:6)
没有看到代码,很难说。
但我的猜测是你有一些交错的声明和代码。 MSVC的C编译器只是C89,它不支持它。这可以解释为什么C ++编译器接受它,但C编译器没有。
在C99之前,所有声明必须在函数的开头或块。
编辑:您的代码没有显示整个功能,但您可能在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;
移动到函数的开头。
答案 1 :(得分:2)
C和C ++之间存在差异。例如,在C89中,您不能在代码块的中间声明变量,而只能在开头声明。
答案 2 :(得分:0)
查看错误说明:http://msdn.microsoft.com/en-us/library/76c9k4ah%28v=vs.71%29.aspx
通过将扩展名更改为.cpp Visual Studio使用C ++编译器而不是C编译器(这是一种完全不同的语言)。
所以你可能已经编写了C ++代码并将其输入到C编译器中,这恰好导致了错误的抛出。