2012-07-12 73 views
0

我在編譯下面的C程序時遇到了困難,這只是我試圖瞭解winsock的開始。 問題是,編譯程序client.c時,我得到一個錯誤(C2143)缺少';'之前輸入' 但是當我將源文件重命名爲'client.cpp'時,程序編譯時沒有錯誤或警告。 我不明白在C語言中是錯誤的語法錯誤,但不是C++。MSVC 10.0 c vs C++區別

#define WIN32_LEAN_AND_MEAN 
#define DEBUG 

#include <windows.h> 
#include <winsock2.h> 
#include <ws2tcpip.h> 
#include <stdlib.h> 
#include <stdio.h> 

#pragma comment (lib, "Ws2_32.lib") 
#pragma comment (lib, "Mswsock.lib") 
#pragma comment (lib, "AdvApi32.lib") 

#define PORT "12186" 
#define BUFFERLEN 512 

int main(int argc, char* argv[]) 
{ 
    /* 
     Variable Declorations 
    */ 
    WSADATA wsaData; 
    SOCKET ConnectionSocket = INVALID_SOCKET; 
    struct addrinfo *result = NULL, *ptr = NULL, hints; 
    int addrResult; 

    ZeroMemory(&hints, sizeof(hints)); 
    hints.ai_family = AF_UNSPEC; //unspecified so we can be compatible with IPv4 and IPv6 
    hints.ai_socktype = SOCK_STREAM; 
    hints.ai_protocol = IPPROTO_TCP; 
    #ifdef DEBUG 
    printf("IPPROTO_TCP: %d", IPPROTO_TCP); 
    #endif 

    //Buffers 
    char * sendbuffer; // Error C2143 
    char recievebuffer [BUFFERLEN]; //Error C2143 

    //Initialize Winsock 
    addrResult = WSAStartup(MAKEWORD(2,2), &wsaData); 
    if(addrResult !=0) 
    { 
     printf("WSAStartup failed: %d", addrResult); 
    } 
    addrResult = getaddrinfo(argv[1], PORT, &hints, &result); 
    if(addrResult != 0) 
    { 
     printf("getaddrinfo failed: %d", addrResult); 
     WSACleanup(); 
     return 1; 
    } 
    return 0; 
} 

編輯: C變量declorations在MSVC的C函數的所有其他代碼之前去。 問題解決了。 這是一個C89的東西還是隻是MSVC?

回答

1

問題可能是變量聲明發生的地方。將它們與其他變量放在函數的開頭。

See the last example from MSDN that can cause this error code.

+0

「在C程序中,變量必須在函數的開頭聲明,函數執行無申報指令後,他們不能聲明。」 謝謝!將變量聲明移動到提示的設置值上方可使c編譯器編譯時不會出錯。 – 2012-07-12 20:40:09

+0

它只與C89。 C99已經放寬了這個要求。 http://ideone.com/lKlZM – Mahesh 2012-07-12 20:42:13

0

與VS一起發行的C編譯器只實現C89(認真...),所以您必須在給定函數的頂部聲明所有變量。