编译器错误C2275

Ahm*_*med 2 c c++ visual-studio-2010

我一直在Visual Studio 2010中编写一个简单的WinSock应用程序.我将我的应用程序入口点命名为"main.c",然后在声明SOCKET对象时遇到了这个错误:

error C2275: 'SOCKET' : illegal use of this type as an expression
Run Code Online (Sandbox Code Playgroud)

奇怪的是,我通过将代码文件从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;
}
Run Code Online (Sandbox Code Playgroud)

Mys*_*ial 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);
Run Code Online (Sandbox Code Playgroud)

这里的解决方案是SOCKET socketobj;使用其他声明移动到函数的开头.

  • @engheema根据最新标准,您的代码完全没问题.责怪MS仅支持C89.:) (2认同)