编译器错误C2275

Compiler error C2275

本文关键字:C2275 错误 编译器      更新时间:2023-10-16

我一直在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: %ldn", WSAGetLastError());
    WSACleanup();
    return 0;
}
else
{
    printf("Socket Intialization Successn");
}
Sleep(10000);
return 0;
}

如果看不到代码,很难判断。

但我的猜测是,您有一些交错的声明和代码。MSVC的C编译器只有C89不支持它。这可以解释为什么C++编译器接受它,而C编译器不接受。

在C99之前,所有声明都必须位于函数或块的开头。

EDIT:您的代码没有显示整个函数,但您可能在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编译器中,这(巧合地)导致了抛出错误。