2012-03-03 86 views
2

我一直在编程Visual Studio 2010中一个简单的WinSock应用程序我有一个名为我的应用程序入口点“main.c”文件,然后我碰到这个错误而来到声明Socket对象:编译器错误C2275

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; 
} 
+2

请发布相关的代码 – JaredPar 2012-03-03 20:19:27

+1

您可能已尝试在块的第一条语句之后声明变量;这在C90中是不允许的。 – 2012-03-03 20:20:11

+0

改变扩展名的区别在于'.cpp'文件被视为C++,'.c'文件被视为C. C和C++是具有不同规则的不同语言(但在很多领域非常相似,显然)。 – 2012-03-03 20:20:24

回答

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;与其他声明的函数的开始。

+0

非常感谢@Mysticial!我把所有的声明放在一起,并且工作。我认为作为一名C++程序员,C很容易,但它们之间的差异似乎很重要。再次感谢 ! – 2012-03-03 20:31:30

+2

@engheema根据最新标准,您的代码完美无瑕。责备MS只支持C89。 :) – Marlon 2012-03-03 20:34:06

+1

如果对C99(或C11)的支持对您很重要,请为[Visual Studio UserVoice上的功能请求提案]投票(http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2089423-C99-支持)。 – 2012-03-03 20:36:18

2

C和C++之间存在差异。例如,在C89中,你不能在代码块的中间声明一个变量,但只能在开头。