簡體   English   中英

編譯器錯誤C2275

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM